У меня есть веб-приложение с формой поиска. Форма используется для поиска через мою собственную базу данных, а также в других базах данных через их службу 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
является переменной, что основной поток может получить доступ к после того, как цикл в то время как было сделано при работающем. Но, поставив точку останова в начале, она никогда не останавливается на достигнутом, сам цикл непрерывный до бесконечности ... Это означает, что событие никогда не запускается.
Я что-то не хватает?
Никогда не дожидайтесь использования цикла (на языке программирования высокого уровня буквально никогда!). Для этого требуется много процессорного времени. У вас много разных методов синхронизации, которые обеспечивают лучшую производительность. –
'BackgroundWorker' не имеет метода' Join() 'Threading. (К сожалению). Существует обходное решение этого, но все заканчивается «ожиданием» этого. – KarelG
'BackgroundWorker' разработан и предназначен для взаимодействия с насосом сообщений UI для Windows. В веб-приложениях нет цикла сообщений, поэтому здесь не используйте Bgw. Имеются документированные шаблоны для асинхронной обработки web-запросов. –