2

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

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

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

如果主线程很慢,我的问题是关于排队事件。例如,“文件观察者”每秒可以找到并引发 1000 个事件,但在处理每个文件的主线程上需要 1 秒。所以事件是排队的。

.NET 中的这种排队有什么限制吗?

谢谢, 巴特克

4

2 回答 2

1

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

于 2012-07-16T07:49:31.440 回答
0

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

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

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

于 2012-07-16T09:52:02.733 回答