2011-05-19 47 views
0

我有一個程序,我想依次將多個任務傳遞給BackGroundWorker。我的問題是RunWorkerCompleted事件沒有被執行,IsBusy標誌沒有被清除。 ProgressChanged事件執行。 DoWork例程中的最終語句確實得到執行。我可以完成第一項任務,但不能完成任何後續任務。BackGroundWorker無法識別DoWork的完成

任何想法要看什麼?

編輯(代碼加):

概念(略微簡化的)是這樣的:

for (int i = 0; i < cnt; i++) 
      { 
       string sDiv = dlg.GetItem(i).Substring(0, 5); 
       bgw8Div.RunWorkerAsync(sDiv); 
       // some kind of wait or delay or test needed here 
      } 

如果CNT == 1,一切都很好。如果cnt> 1,則無論等待或延遲放在循環中,情況i == 0都不會執行RunWorkerCompleted事件。

+3

請顯示您的代碼。任何一個BackgroundWorker只能完成一次。如果你在等待額外的任務,你還沒有真正完成。 – 2011-05-19 16:53:56

+0

我在BackgroundWorker內部移動了循環,並且它全部執行正常,但現在將表單上的用戶消息放在窗體上可以讓用戶知道進度,這會更加複雜。 – SeaDrive 2011-05-19 18:14:14

回答

1

你必須以編程方式創建的BackgroundWorker:

for (int i = 0; i < cnt; i++) 
     { 
      string sDiv = dlg.GetItem(i).Substring(0, 5); 
      var bgw = new BackGroundWorker(); 
      // some kind of wait or delay or test needed here 
      bgw.DoWork += 
      new DoWorkEventHandler(bw_DoWork); 
      bgw.ProgressChanged += 
      new ProgressChangedEventHandler(bw_ProgressChanged); 
      bgw.RunWorkerCompleted += 
      new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
      bgw.RunWorkerAsync(sDiv); 
     } 

另一種選擇是要等到你bgw8Div完成。你可以在How to wait for a BackgroundWorker to cancel?找到更多信息。當然,你會以這種方式失去多線程功能。

+0

這個鏈接的信息似乎涵蓋了基地。謝謝。 – SeaDrive 2011-05-19 18:11:48

+0

沒問題。祝你好運。 – Kamyar 2011-05-19 18:12:07

相關問題