2011-04-26 48 views
2

我们开发了一个vb.net应用程序,使用多线程侦听器概念和每个要监视的文件夹的专用线程。我们同时跟踪每个文件夹中的传入文件。Multithread-.Net上的问题

目前,无论何时我们收到多个批量卷文件,并行处理文件被延迟与线程概念或有时失败,我们都面临着一个问题。我们需要实施与其他一些概念相同的逻辑,以避免多重处理。请提供你的建议。或者是否可以通过相同的线程概念实现性能调整?请指导我。

回答

0

我怀疑什么可能会帮助你是文件系统监视器和后台工作者子系统的组合。

对于FileSystemMonitor,点击这里

http://www.codeproject.com/KB/files/monitor_all_filesystem.aspx

基本上,有API,您可以用它来注册自己发出信号时,特定的文件夹的变化(新/更改/删除的文件)。

与一个通过BackGroundWorked对象在后台执行工作的系统结合在一起,你根本不需要直接处理多个线程。 BackgroundWorkers会自动分离出独立的线程以保持你的UI响应。

2

下面是我将如何解决这个问题。

首先,使用FileSystemWatcher来监控文件夹。当Created事件(或任何其他关心的事件)被引发时,将引起该事件的文件添加到队列中。该队列将包含所有需要处理的文件。

其次,使用生产者 - 消费者模式来处理添加到队列中的文件。如果您的队列类型为BlockingCollection,这很容易实现。关于BlockingCollection的好处是,它为您抽象了大部分生产者 - 消费者逻辑。方法阻止Take,直到至少有一个项目被添加到队列中。您可以拥有任意数量的线程,只要您想监控此队列即可。他们会耐心等待,直到项目添加到队列中。

以下是使用此方法的几个优点。

  • 由于BlockingCollection已经是线程安全的,因此实现相对容易。
  • 您想要的并行性数量取决于您为监控队列而创建的线程数量。
  • 处理文件不会干扰将文件添加到队列中的FileSystemWatcher事件处理程序。
  • 队列充当缓冲区,其内容将随着文件出现的速率与处理这些文件的速率相比发生变化而逐渐消失和流动。