BackgroundWorker ReportProgress事件队列

时间:2012-07-16 07:46:19

标签: c# .net backgroundworker

我有一个BackgroundWorker,它以1秒的间隔监视文件夹中的文件。如果找到文件,则会为每个找到的文件引发ReportProgress(0,fileName)。

在主线程上,我订阅了该事件并处理每个文件。

这是:找到一个文件=一个引发事件=一个处理文件

我的问题是如果主线程很慢,则排队事件。 例如,'文件观察器'可以每秒查找并引发1000个事件,但是在主线程上处理每个文件需要1秒。所以事件排队等等。

.NET中的那种排队是否有任何限制?

谢谢, 鲍尔泰克

2 个答案:

答案 0 :(得分:1)

主线程最终将处理所有文件。但是,如果您有某种GUI,我建议您在单独的线程上进行处理。

答案 1 :(得分:0)

BackgroundWorker在内部使用SynchronizationContextPost异步消息。如果它是启动BW的GUI线程,它将使用专门的WinForms SynchronizationContext并使用消息循环向该主线程报告进度。

在您的情况下,它是一个Windows服务线程,因此没有SynchronizationContext。发生的是默认SynchronizationContext被实例化和使用。然后,行为完全不同,并且新的ThreadPool用于异步消息。因此,您的文件处理将在由内部ThreadPool启动的单独线程中进行,而不是像WinForms中的主线程。

虽然ThreadPool应该正确处理大队列(无法立即找到ThreadPool队列大小的任何硬限制 - 任何人都知道吗?),但请确保您不能在此模式中假设确定性顺序文件处理。