并行处理队列的好策略是什么?

dlr*_*as2 3 c# queue parallel-processing deadlock

我正在编写一个程序,需要递归搜索文件夹结构,并希望与多个线程并行执行.

我已经编写了相当简单的同步方法 - 最初将根目录添加到队列,然后将目录出列,对其子目录进行排队等,直到队列为空.我会用ConcurrentQueue<T>我的队列,但已经意识到我的循环会过早停止.第一个线程将使根目录出列,并且每个其他线程立即看到队列为空并退出,使第一个线程成为唯一运行的线程.我希望每个线程循环直到队列为空,然后等待另一个线程排队更多的目录,然后继续.我需要在循环中使用某种检查点,以便在每个线程都到达循环结束之前不会退出任何线程,但是我不确定最好的方法是在没有死锁的情况下执行此操作,而实际上没有更多的目录处理.

Ric*_*ard 5

使用任务并行库.

创建一个Task以处理第一个文件夹.在此创建一个Task处理每个子文件夹(递归)和每个相关文件的任务.然后等待此文件夹的所有任务.

TPL运行时将使用线程池来避免创建线程,这是一项昂贵的操作.对于小件工作.

注意:

  • 如果每个文件的工作是微不足道的,那么它是内联的而不是创建另一个任务(IO性能将是限制因素).
  • 如果避免阻塞操作,这种方法通常效果最好,但如果IO性能是限制,那么无论如何这可能无关紧要 - 开始简单和测量.
  • 在.NET 4之前,可以使用线程池完成大部分工作,但是您需要使用事件来等待任务完成,并且等待将占用线程池线程.1

1据我了解,在TPL等待任务时 - 使用TPL方法 - TPL将重用该线程用于其他任务,直到等待完成为止.