c# - RunWorkerAsync 完成时关闭BackgroundWorker

标签 c# .net multithreading asynchronous backgroundworker

我有一个后台工作程序,需要根据选中的复选框数量多次调用 - 我编写此代码是为了获取复选框值并将它们放入 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/

相关文章:

c# - TPL DataFlow,优先链接 block ?

c# - Unregister(this) 从所有内容中取消注册此实例?

c++ - 创建一个类来存储线程并调用它们

c# - 使用 CaSTLe 注入(inject)具有非通用实现的开放通用接口(interface)

.net - 代码契约和编译

java - Android:当 sleep 或等待不起作用时,如何在方法中设置时间间隙

c - 实现线程调度器循环和线程取消

c# - php 到 C# 使用 Rijindael-256 算法加密并使用 base64 算法编码的 JSON 数据数组

c# - WPF DataGrid 行以编程方式双击事件

c# - 我可以拆箱一个字符串吗?