2011-05-30 64 views
4

在我的WPF应用程序 - 我有一个与Gridview里面的ListView。用户可以将文件添加到此列表中。我可以在WPF中以同步的方式使用多个BackgroundWorker吗?

在GridView应该让我有相当丰富的“行”,每行显示文件名,额外的应用程序的细节,最重要的一个进度条。 gridview中的每一行都是绑定到集合中的业务对象的数据绑定,具体来说,该对象具有绑定到进度条的“Progress”属性。

我需要处理的每个文件,提取数据,并将数据发送到Web服务,我想,以显示其各自的进度条,每个文件的进度,我通过文件的收集工作。

最初我开始了与含有定期更新“进度”字段的每一行,并指出,所述UI没有更新很好处理逻辑一个简单的循环。

我然后移动在循环处理逻辑,以一个BackgroundWorker其修改的业务对象“进步”领域,因为UI线程不工作这么难 - 这是一个很大的响应速度。

然而,由于的BackgroundWorker的异步性,它开始多BackgroundWorkers(每行一个),几乎所有的在一次作为纺出的循环。我所有的进度条开始进展...

什么是最好的方法将它限制在只有2-3个BackgroundWorkers同时进行?甚至把它留在一个BackgroundWorker上 - 直到前一个完成才开始?我如何引入一个依赖关系,以使所有BackgroundWorkers实质上都是同步的?

+3

如果您希望它们是同步的,那么为什么不创建一个后台工作人员,以同步方式完成所有工作,而不是将其分成多个工作人员? – 2011-05-30 13:09:49

回答

7

你可以在样here

+0

感谢您的链接 - 自定义调度程序看起来是指定所需并行度的好方法。 – dan 2011-05-30 22:29:26

2

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

但是,如果您只想根据当前正在运行的硬件以最佳方式完成工作,那么我会说将它留给默认的任务调度程序。只要您想为网格行工作并将计划安排到.NET,就可以在TaskFactory上调用StartNew

如果你有任务之间的依赖关系,你可以使用ContinueWith overloads之一维护作业之间的顺序。

+0

谢谢伊萨克 - 您的评论以上(尴尬明显:))以及您在这里给出的额外信息。 – dan 2011-05-30 22:33:47

+0

没问题。很高兴我能帮上忙 – 2011-05-31 05:52:10

相关问题