1

私は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ジョブのすべてのスレッドが終了した後にメソッドを呼び出すにはどうすればよいですか?

注:ご存知かもしれませんが、いくつのファイルが存在するかわからないため、スレッドがいくつ作成されるかわかりません。また、タイムアウトの設定はオプションではありません。

4

2 に答える 2