【问题标题】:Can I use multiple BackgroundWorker's in a synchronous way in WPF?我可以在 WPF 中以同步方式使用多个 BackgroundWorker 吗?
【发布时间】:2011-05-30 13:01:55
【问题描述】:

在我的 WPF 应用程序中 - 我有一个内部带有 Gridview 的 Listview。用户可以将文件添加到此列表中。

gridview 应该允许我拥有相当丰富的“行”,每行显示文件名、额外的应用程序详细信息,最重要的是一个进度条。 gridview 中的每一行数据绑定到集合中的业务对象,具体而言,该对象具有绑定到进度条的属性“Progress”。

我需要处理每个文件,提取数据并将数据发送到 Web 服务,并且我想在处理文件集合时在其各自的进度条中显示每个文件的进度。

最初,我从一个包含处理逻辑的简单循环开始,该循环定期更新每一行的“进度”字段,并注意到 UI 没有很好地更新。

然后,我将循环中的处理逻辑移至修改业务对象“Progress”字段的 BackgroundWorker,并且因为 UI 线程工作不那么努力 - 它的响应速度更快。

但是,由于 BackgroundWorker 的异步特性,它在循环开始时几乎同时启动了多个 BackgroundWorker(每行一个)。我所有的进度条都开始进步了...

将其限制为一次只能运行 2-3 个 BackgroundWorker 的最佳方法是什么?或者甚至将它留在一个 BackgroundWorker - 并且直到前一个完成后才开始?我怎样才能引入一个依赖,以便本质上所有的 BackgroundWorkers 都是同步的?

【问题讨论】:

  • 如果你想让它们同步,那你为什么不创建一个以同步方式完成所有工作的后台工作人员,而不是将其分成多个工作人员?

标签: c# wpf multithreading .net-4.0 synchronization


【解决方案1】:

您可以为此使用 Task 类,如示例 here

【讨论】:

  • 感谢您的链接 - 自定义调度程序看起来是指定所需并行度的好方法。
【解决方案2】:

如果你真的只想同时执行一个,那么有几种方法。您可以像@oleksii 在他的回答中建议的那样使用Task 类和TaskScheduler,或者您可以将工作元素发布到队列并让后台线程一个接一个地工作。

但是,如果您只想根据程序运行的当前硬件以最佳方式完成工作,那么我会说将其留给默认任务调度程序。每当您想为网格行工作并将调度留给 .NET 时,只需在 TaskFactory 上调用 StartNew

如果任务之间确实存在依赖关系,则可以使用ContinueWith overloads 之一来维护作业之间的顺序。

【讨论】:

  • 感谢 Isak - 您在上面的评论(非常明显:))以及您在此处提供的额外信息。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多