我有一个后台工作程序,需要根据选中的复选框数量多次调用 - 我编写此代码是为了获取复选框值并将它们放入 List
中。
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()
的后台工作程序有一个条件,但这(显然)只是跳过了剩余的迭代而不执行。
最佳答案
如果您想按顺序处理每个项目,则没有理由为每个任务使用单独的后台工作程序。因此最好将 foreach 循环移至 DoWork 方法中。但如果您想并行处理所有项目,则需要为每个项目创建一个后台 worker 。
关于c# - RunWorkerAsync 完成时关闭BackgroundWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10634084/