有关Multithread-.Net的问题

时间:2011-04-26 13:16:47

标签: vb.net multithreading

我们开发了一个vb.net应用程序,它使用多线程监听器概念和每个要监控的文件夹的专用线程。有了它,我们同时跟踪每个文件夹中的传入文件。

目前,每当我们收到批量卷的多个文件,文件的并行处理因线程概念而延迟或有时失败时,我们都会遇到问题。我们需要使用其他一些概念来实现相同的逻辑,避免多线程。请提供相同的建议。或者是否可以使用相同的线程概念实现性能调整?请指导我。

2 个答案:

答案 0 :(得分:2)

以下是我如何处理这个问题。

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

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

以下是使用此方法的一些优点。

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

答案 1 :(得分:0)

我怀疑可能对您有所帮助的是文件系统监视器和后台工作器子系统的组合。

对于FileSystemMonitor,请点击此处

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

基本上,您可以使用apis注册自己,以便在特定文件夹更改(新/已更改/已删除文件)时发出信号。

将它与通过BackGroundWorked对象在后台执行工作的系统结合起来,你根本不应该直接处理多个线程。 BackgroundWorkers将自动在单独的线程上旋转,以保持您的ui响应。