我正在开发一个用 c# 编写的控制台应用程序
这个应用程序的目的是浏览所有驱动器和文件并对它们做一些事情。但是用一个线程遍历所有文件是一个耗时的过程,这不是我的目标。
所以我决定用ThreadPool
这样的方式处理它:
class Program () {
static void Main(string[] args) {
foreach (var d in DriveInfo.GetDrives()) {
ThreadPool.QueueUserWorkItem(x => Search(d.RootDirectory.GetDirectories()));
}
Console.WriteLine("Job is done.");
Console.ReadKey();
}
private static void Search(DirectoryInfo[] dirs) {
foreach (var dir in dirs) {
try {
foreach (var f in dir.GetFiles()) {
ThreadPool.QueueUserWorkItem(x => DoTheJob(f));
}
ThreadPool.QueueUserWorkItem(x => Search(dir.GetDirectories()));
} catch (Exception ex) {
continue;
}
}
}
}
问题是Console.WriteLine("Job is done.")
在所有线程完成之前执行。我已经阅读了一些问题和答案,但没有一个能解决我的问题。
ThreadPool
在所有线程完成工作后如何调用方法?
注意:您可能知道,我不知道将创建多少线程,因为我不知道那里有多少文件。并且设置超时不是一种选择。