1

複数のスレッドが実行されている小さな C# アプリがありますが、メイン スレッドはすべてのスレッドが終了するまで待機する必要があり、それから残りの処理を実行できます。問題は、各スレッドに .join() を使用していることです。これは、各スレッドが終了するのを待ってから次のスレッドに進むように見えます。これにより、アプリは実際にはマルチスレッド化されず、終了するのに時間がかかります。

この問題を回避する方法や、アクティブなスレッドがもうないかどうかを確認する方法があるのではないかと思います。

ありがとう

4

5 に答える 5

1

Thread オブジェクトにしがみついている場合は、 を使用できますThread.IsAlive

または、完了時にスレッドからイベントを発生させることを検討することもできます。

于 2013-06-01T03:34:06.337 に答える
1

Thread.Join()アプリケーションがマルチスレッド化されていないという意味ではありません。現在のスレッドに、他のスレッドが終了するのを待つように指示します。これはまさにあなたが望むものです。

次のことを行います。

List<Thread> threads = new List<Thread>();

/** create each thread, Start() it, and add it to the list **/

foreach (Thread thread in threads)
{
  thread.Join()
}

現在/メインのスレッドを除いて、他のスレッドを実行し続けます (他のスレッドが完了するまで待機します)

使うだけThread.Join()

于 2013-06-01T04:19:53.107 に答える
0

BackgroundWorkerを使ってみる

RunWorkerCompleted作業が完了した後、メイン スレッド ( ) でイベントを発生させます。

これは、以前に回答された質問の 1 つのサンプルです。

https://stackoverflow.com/a/5551376/148697

于 2013-06-01T04:29:42.297 に答える
0

はい、Cuong Le が言ったように、Task Parallel Library を使用すると非常に効率的です。ただし、スレッドのリストを作成して、それらが生きているかどうかを確認できます。

var threadsList = new List<Thread>();

threadsList.Add(myThread); // to add

bool areDone = true;
foreach (Thread t in threadsList) { 
    if (t.IsAlive)
    {
        areDone = false;
        break;
    }
}

if (areDone)
{
    // Everything is finished :O
}
于 2013-06-01T03:36:20.783 に答える