2014-01-11 4 views
0

У меня есть веб-приложение с формой поиска. Форма используется для поиска через мою собственную базу данных, а также в других базах данных через их службу API. Чтобы обеспечить быстрый ответ, я решил разделить работу в основном потоке и службе фонового работника.фокусник не стреляет RunWorkerCompleted событие

Вот мой метод, который выполняет задачу поиска.

// search through other API 
BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
worker.WorkerSupportsCancellation = true; 
worker.WorkerReportsProgress = true; 
worker.RunWorkerAsync(form); 

// search in my api 
... 

// wait for API results 
while (worker.IsBusy) { 
    for (sbyte i = 0; i < sbyte.MaxValue; i++) ; 
} 
// handle data and show to user 

И методы

private void worker_DoWork(object sender, DoWorkEventArgs e) { 
    Forms f = e.Argument as Forms; 
    if (f != null) { 
     List<ApiResponse> result = GetDataFromOtherApi(f); 
     e.Result = result; 
    } 
    else e.Result = null; 
} 

Метод GetDataFromOtherApi() отлично работает в тесте одного потока. Он также работает при запуске потока backgroundworker. Я установил точку останова в конце, и e.Result имеет значения, которые я искал.

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
    List<ApiResponse> reply = e.Result as List<ApiResponse>; 

    if (reply == null) ar = null; 
    else if (reply.Any()) ar = reply; 
    else ar = null; 
} 

ar является переменной, что основной поток может получить доступ к после того, как цикл в то время как было сделано при работающем. Но, поставив точку останова в начале, она никогда не останавливается на достигнутом, сам цикл непрерывный до бесконечности ... Это означает, что событие никогда не запускается.

Я что-то не хватает?

+0

Никогда не дожидайтесь использования цикла (на языке программирования высокого уровня буквально никогда!). Для этого требуется много процессорного времени. У вас много разных методов синхронизации, которые обеспечивают лучшую производительность. –

+0

'BackgroundWorker' не имеет метода' Join() 'Threading. (К сожалению). Существует обходное решение этого, но все заканчивается «ожиданием» этого. – KarelG

+0

'BackgroundWorker' разработан и предназначен для взаимодействия с насосом сообщений UI для Windows. В веб-приложениях нет цикла сообщений, поэтому здесь не используйте Bgw. Имеются документированные шаблоны для асинхронной обработки web-запросов. –

ответ

3

BackgroundWorker прогресс & завершенные события синхронизированы для работы в потоке пользовательского интерфейса. Я предполагаю, что вы блокируете этот поток, их никогда не уволят.

Смежные вопросы