0

私の問題を示すためにこのクラスがあります:

class Program
{
    static List<FileInfo> _foundFiles;
    static int _numberPadding = 0;
    static Thread newThread;

    static void Main(string[] args)
    {
        _foundFiles = new List<FileInfo>();

        _shouldStop = false;
        newThread = new Thread(new ThreadStart(StartSearch));
        newThread.Start();

        newThread.Join();

        Console.WriteLine("Finished");
        Console.ReadKey();
    }

    static volatile bool _shouldStop;

    static void StartSearch()
    {
        IterateFileSystemNon(new DirectoryInfo(@"D:\OLD Melman\Music Backup\iTunes 28-06-11\Music"));
    }

    static void IterateFileSystemNon(DirectoryInfo folder)
    {
        string pad = CreatePadding();

        Console.WriteLine("{0} Directory: {1}", pad, folder.Name);

        foreach (var dir in folder.GetDirectories())
            IterateFileSystemNon(dir);

        pad = CreatePadding();

        foreach (var file in folder.GetFiles())
        {
            if (file.Extension.Contains("mp3"))
            {
                _foundFiles.Add(file);

                Console.WriteLine("{0} File: {1}", pad, file.Name);
            }
        }

        _numberPadding = _numberPadding - 6;
    }

    static string CreatePadding()
    {
        _numberPadding = _numberPadding + 3;

        var stringRepOfPadding = new StringBuilder(_numberPadding);
        for (int i = 0; i < _numberPadding; i++)
        {
            stringRepOfPadding.Append(" ");
        }
        return stringRepOfPadding.ToString();
    }
}

私はこれらの質問があります:

  1. これはコンソール アプリでは機能しますが、WindowsFormsApplication では機能しません。Joinステートメントに直行するだけです。これはなぜですか?
  2. Microsoft が述べている Join ステートメントの場合、「生成されたスレッドが終了するまで現在のスレッドをブロックすると想定されます」。確かにこれはマルチスレッドの目的を無効にしますか? 私の WindowsFormsApplication では、このスレッドがタスクを実行している間、スレッドをブロックしたくありません。
  3. Join が必要な理由。確かに、私の Iteration void が反復を完了すると、スレッドは終了するはずですか?!
  4. 新しいスレッド内で、スレッドが終了したことをどのように示して、スレッドを閉じますか?
4

2 に答える 2

1
  1. 参加すると、UIスレッドがハングします。BackgroundWorkerコンポーネントを使用して、バックグラウンドスレッドでファイルを検索します。
  2. スレッドを開始してそれに参加しないでください。この場合、非同期で実行されるものはないため、これは1つのスレッドですべての作業を順番に実行することと同じです。
  3. 参加する必要はありません(p2を参照)。また、UIスレッドでJoinを使用することは、常に悪い考えです。
  4. スレッドを閉じるためにスレッドが終了したことを示す必要はありません。スレッドデリゲートが実行を終了すると、スレッドは終了します。マルチスレッド:スレッドの終了を参照してください。
于 2013-01-13T22:47:46.553 に答える
0
  1. 「直接合流する」とはどういう意味ですか? 他のスレッドがスケジュールされてブレークポイントに到達する前に、開始スレッドが Join に到達する可能性は十分にあります。Windows フォーム アプリが何をしているのか、期待していないことについて詳しく説明していただけますか? その場合、ワーカースレッドが途中で終了する原因となる例外があるのでしょうか?
  2. Join をすぐに呼び出す必要はありませんアイデアは、スレッドを開始し、現在のスレッドで必要なことを行い、2 番目のスレッドからの結果が必要な場合は、Join を呼び出して完了するまで待機するというものです。
  3. はい、列挙が終了するとスレッドは終了します。
  4. コンストラクターに渡されたメソッドから戻るだけですThread。(StartSearchあなたの場合)。
于 2013-01-13T22:42:22.950 に答える