English 中文(简体)
我可以在WPF中以同步方式使用多个BackgroundWorker吗?
原标题:Can I use multiple BackgroundWorker s in a synchronous way in WPF?

在我的WPF应用程序中,我有一个Listview,里面有一个Gridview。用户可以将文件添加到此列表中。

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

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

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

然后,我将循环中的处理逻辑移动到BackgroundWorker,它修改了业务对象“Progress”字段,因为UI线程工作不太努力,所以响应速度要快得多。

然而,由于BackgroundWorker的异步性质,它在循环结束时几乎同时启动了多个BackgroundWorkers(每行一个)。我所有的进度条都开始进步。。。

将其限制为同时只有2-3名后台工作人员的最佳方法是什么?或者甚至把它留给一个BackgroundWorker,直到上一个完成后才开始?如何引入依赖关系,使所有BackgroundWorkers本质上都是同步的?

最佳回答

您可以使用Task类来实现这一点,如示例此处

问题回答

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

但是,如果你只想根据程序运行的当前硬件以最优化的方式完成工作,那么我会说把它留给默认的任务调度程序。只需致电每当您想为网格行执行工作并将调度留给.NET时,都可以在TaskFactory上启动新

如果任务之间确实存在依赖关系,则可以使用继续使用重载来维护作业之间的秩序。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签