【问题标题】:C# backgroundworker started within a for loopC# backgroundworker 在 for 循环中启动
【发布时间】:2016-03-20 19:11:13
【问题描述】:

我有以下代码来启动后台工作者:

foreach (var item in this.lstbxItems.Items)
{
    if (!bw.IsBusy)
        bw.RunWorkerAsync(item);
}

有没有办法等待后台工作人员 (bw) 完成,然后将列表中的下一项发送给它?

【问题讨论】:

  • 您使用哪个版本的 .net 框架?如果 4.0 或更高版本,丢弃 Backgroundworker 并使用 Task
  • 我建议使用TPL then,这将使许多任务变得更容易。比如等待操作完成、并发启动多个任务、错误处理等。
  • 这听起来像是使用 Microsoft 的响应式扩展 (NuGet "Rx-WinForms") 的完美场景。

标签: c# multithreading winforms


【解决方案1】:

这听起来像是使用 Microsoft 的响应式扩展 (NuGet "Rx-WinForms") 的完美场景。

您的代码将如下所示:

var query =
    from item in this.lstbxItems.Items.ToObservable()
    from result in Observable.Start(() => ProcessItem(item))
    select new { item, result };

IDisposable subscription =
    query
        .ObserveOn(this) /* marshals to UI-thread */
        .Subscribe(x =>
        {
            /* do something with each `x.item` & `x.result`
            as soon as they are asyncronously computed */
        });

如果您需要在计算自然完成之前停止计算,您可以致电subscription.Dispose()

【讨论】:

    猜你喜欢
    • 2012-06-02
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多