2014-01-11 114 views
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循環已與運行完成後。但是,在開始時放置斷點時,它永遠不會停留在那裏,循環本身會持續到無窮大......這意味着事件永遠不會被觸發。

我錯過了什麼?

+0

永遠不要等待使用循環(在高級編程語言中從字面上永遠不會!)。這花費了大量的處理器時間。你有很多不同的同步方法可以提供更好的性能。 –

+0

'BackgroundWorker'沒有來自Threading的'Join()'方法。 (可惜)。有一個解決方法是真的,但一切都以「等待」結束。 – KarelG

+0

'BackgroundWorker'旨在與Windows UI消息泵合作。 Web應用程序中沒有Message循環,所以不要在這裏使用Bgw。有網絡請求異步處理的文檔模式。 –

回答

3

BackgroundWorker進度&完成的事件被同步在UI線程上運行。我想,當你阻止那個線程時,他們永遠不會被解僱。