在我的WPF应用程序中 - 我有一个带有Gridview的Listview。用户可以将文件添加到此列表中。
gridview应该允许我拥有相当丰富的“行”,每行显示文件名,额外的应用程序细节,最重要的是进度条。 gridview中的每一行都被数据绑定到集合中的业务对象,具体而言,该对象具有绑定到进度条的属性“Progress”。
我需要处理每个文件,提取数据并将数据发送到Web服务,我希望在处理文件集时显示每个文件在其各自进度条中的进度。
最初,我开始使用一个包含处理逻辑的简单循环,该循环定期更新每行的“Progress”字段,并注意到UI没有很好地更新。
然后我将循环中的处理逻辑移动到BackgroundWorker,后者修改了业务对象“Progress”字段,并且因为UI线程没有那么努力 - 它的响应速度要快得多。
然而,由于BackgroundWorker的异步特性,它在循环旋转时几乎同时启动了多个BackgroundWorkers(每行一个)。我的所有进度条都开始进展......
什么是最好的方法将它限制为只有2-3个BackgroundWorkers同时进行?或者甚至将它留在一个BackgroundWorker上 - 它在上一个完成之前不会启动?如何引入依赖关系以便本质上所有BackgroundWorkers都是同步的?
答案 0 :(得分:7)
您可以使用任务类,例如示例here
答案 1 :(得分:2)
如果你真的只希望同时执行一个,那么有几种方法。您可以在他的答案中使用Task类和@oleksii之类的TaskScheduler,或者您可以将工作元素发布到队列中,并让后台线程一个接一个地工作。
但是,如果您想要的是以最佳方式完成工作,具体取决于您的程序运行的当前硬件,那么我会将其留给默认任务调度程序。只要你想为网格行工作并将调度留给.NET,就可以在TaskFactory上调用StartNew。
如果您确实在任务之间存在依赖关系,则可以使用ContinueWith overloads之一维护作业之间的顺序。