我正在编写一个程序,需要递归搜索文件夹结构,并且希望与多个线程并行执行此操作。
我已经编写了相当简单的同步方法 - 最初将根目录添加到队列中,然后将目录出队,对其子目录进行排队等,直到队列为空。我会用一个ConcurrentQueue<T> http://msdn.microsoft.com/en-us/library/dd267265.aspx对于我的队列,但已经意识到我的循环将过早停止。第一个线程将使根目录出列,并且立即所有其他线程都可以看到队列为空并退出,使第一个线程成为唯一正在运行的线程。我希望每个线程循环直到队列为空,然后等到另一个线程将更多目录排队,然后继续。我的循环中需要某种检查点,以便在每个线程都到达循环末尾之前,没有任何线程会退出,但我不确定当确实没有更多目录时,在不发生死锁的情况下执行此操作的最佳方法过程。
Use the 任务并行库 http://msdn.microsoft.com/en-us/library/dd460717.aspx.
创建一个Task http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx处理第一个文件夹。在此创建一个Task
(递归地)处理每个子文件夹以及每个相关文件的任务。然后等待所有 http://msdn.microsoft.com/en-us/library/dd270695.aspx该文件夹的任务。
TPL 运行时将利用线程池来避免创建线程,这是一项昂贵的操作。对于小件工作。
Note:
- 如果每个文件的工作量很小,请内联执行,而不是创建另一个任务(IO 性能将是限制因素)。
- 如果避免阻塞操作,这种方法通常效果最好,但如果 IO 性能是极限,那么这可能并不重要——从简单开始并进行测量。
- Before .NET 4 much of this can be done with the thread pool, but you'll need to use events http://msdn.microsoft.com/en-us/library/system.threading.manualreseteventslim.aspx to wait for tasks to complete, and that waiting will tie up thread pool threads.1
1 As I understand it, in the TPL when waiting on tasks—using a TPL method—TPL will reuse that thread for other tasks until the wait is fulfilled.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)