我有一个程序,我希望按顺序将多个任务传递给BackGroundWorker。我的问题是没有执行RunWorkerCompleted事件并且没有清除IsBusy标志。 ProgressChanged事件确实执行。 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事件。
答案 0 :(得分: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?找到更多信息。当然,你会以这种方式失去多线程功能。