我有一个后台工作人员,需要基于复选框的数量被调用多次 - 我写了这个来获取复选框的值,并将它们放入List
。RunWorkerAsync关闭完成的BackgroundWorker
List repSelected = new List();
这是填充,然后遍历像这样:
foreach (string rep in repSelected)
{
backgroundWorker1.RunWorkerAsync(rep);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}
异步,DoWork的代码如下所示:
BackgroundWorker worker = sender as BackgroundWorker;
string rep = e.Argument.ToString();
if (worker.CancellationPending == true)
{
e.Cancel = true;
}
else
{
DirectoryExists(rep);
ProcessRunner(rep); //Rars some large files - expensive
}
过程然后运行WorkerComplete,问题是当该过程返回去执行Worker的下一次迭代,它崩溃时表示该worker正忙 - 即使worker已经返回它的WorkerCompleted状态。
如何确保在循环的下一次迭代之前关闭线程?
注:我有一个包含!backgroundWorker1.IsBusy()
的背景工作条件,但是这(显然)只是跳过剩余的迭代而不执行。
非常好,正是我之后,谢谢!出于好奇,是否有可能为每个项目创建一个新的后台工作者,但仍然使用相同的代码来执行? –
您可以将DoWork代码移动到单独的方法中,并使用rep值作为参数。但是,在您的代码中,似乎您正在处理文件,因此如果将它们放置在机械驱动器(而非SSD)上,那么如果按顺序处理文件,我认为您的代码的性能会更好。这是因为您将避免来回移动磁盘头。 –
@HenkHolterman使用1 Backgroundworker with parallel.foreach将导致相同的异常。 – daryal