我有一个BackgroundWorker,它以1秒的间隔监视文件夹中的文件。如果找到文件,则会为每个找到的文件引发ReportProgress(0,fileName)。
在主线程上,我订阅了该事件并处理每个文件。
这是:找到一个文件=一个引发事件=一个处理文件
我的问题是如果主线程很慢,则排队事件。 例如,'文件观察器'可以每秒查找并引发1000个事件,但是在主线程上处理每个文件需要1秒。所以事件排队等等。
.NET中的那种排队是否有任何限制?
谢谢, 鲍尔泰克
答案 0 :(得分:1)
主线程最终将处理所有文件。但是,如果您有某种GUI,我建议您在单独的线程上进行处理。
答案 1 :(得分:0)
BackgroundWorker
在内部使用SynchronizationContext
到Post
异步消息。如果它是启动BW的GUI线程,它将使用专门的WinForms SynchronizationContext
并使用消息循环向该主线程报告进度。
在您的情况下,它是一个Windows服务线程,因此没有SynchronizationContext
。发生的是默认SynchronizationContext
被实例化和使用。然后,行为完全不同,并且新的ThreadPool
用于异步消息。因此,您的文件处理将在由内部ThreadPool
启动的单独线程中进行,而不是像WinForms中的主线程。
虽然ThreadPool
应该正确处理大队列(无法立即找到ThreadPool队列大小的任何硬限制 - 任何人都知道吗?),但请确保您不能在此模式中假设确定性顺序文件处理。