0
我有一個搜索表單的Web應用程序。該表單正在用於搜索我自己的數據庫,但也用於通過其API服務在其他數據庫中進行搜索。爲了提供快速響應,我決定拆分主線程和背景工作服務中的工作。backgroundworker not firing RunWorkerCompleted event
這是我的方法,它運行搜索任務。
// 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
是一個變量,主線程可以訪問while循環已與運行完成後。但是,在開始時放置斷點時,它永遠不會停留在那裏,循環本身會持續到無窮大......這意味着事件永遠不會被觸發。
我錯過了什麼?
永遠不要等待使用循環(在高級編程語言中從字面上永遠不會!)。這花費了大量的處理器時間。你有很多不同的同步方法可以提供更好的性能。 –
'BackgroundWorker'沒有來自Threading的'Join()'方法。 (可惜)。有一個解決方法是真的,但一切都以「等待」結束。 – KarelG
'BackgroundWorker'旨在與Windows UI消息泵合作。 Web應用程序中沒有Message循環,所以不要在這裏使用Bgw。有網絡請求異步處理的文檔模式。 –