C# BackgroundWorker报告进度事件队列

C# BackgroundWorker报告进度事件队列,c#,.net,backgroundworker,C#,.net,Backgroundworker,我有一个后台工作人员,以1秒的间隔监视文件夹中的文件。如果找到文件,则会为每个找到的文件引发ReportProgress(0,文件名) 在主线程上,我订阅该事件并处理每个文件 这是:一个找到的文件=一个引发的事件=一个已处理的文件 我的问题是关于在主线程运行缓慢时对事件进行排队。 例如,“文件监视程序”每秒可以查找并引发1000个事件,但在主线程上处理每个文件需要1秒。所以事件是排队的 在.NET中,这种排队有限制吗 谢谢, Bartek否主线程最终将处理所有文件。但是,如果您有某种GUI,我建

我有一个后台工作人员,以1秒的间隔监视文件夹中的文件。如果找到文件,则会为每个找到的文件引发ReportProgress(0,文件名)

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

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

我的问题是关于在主线程运行缓慢时对事件进行排队。 例如,“文件监视程序”每秒可以查找并引发1000个事件,但在主线程上处理每个文件需要1秒。所以事件是排队的

在.NET中,这种排队有限制吗

谢谢,
Bartek

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

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

在您的情况下,它是一个windows服务线程,因此没有同步上下文。将实例化并使用默认的
SynchronizationContext
。然后,行为就完全不同了,一个新的
ThreadPool
用于异步消息。因此,您的文件处理将在该内部
线程池
启动的独立线程中进行,与WinForms中的主线程相反


虽然
ThreadPool
应该正确处理大型队列(无法立即找到任何关于ThreadPool队列大小的硬限制-有人知道吗?),您必须知道,在此模式下,您不能假定确定性顺序文件处理。

您可以使用而不是后台工作程序?
FileSystemWatcher
在频繁/重大更改发生时不可靠。更改它的内部缓冲区可能会有所帮助,但它也有一个硬限制。这是一个windows服务,所以这应该是好的。我只是想知道是否有什么是不会错过的,但正如你所说,这看起来不错。Thanks@bodziec所有事件都应该得到处理,当然,除非在处理一个事件的过程中发生异常。但是,有几种方法可以处理这种情况。据我所知,线程池队列没有硬限制。唯一的限制是机器有足够的资源来处理负载。