13

.NET CF 2.0 でスレッドを開始するためのコードがいくつかあります。

ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();

これをループ内で呼び出すと、アイテムが完全に順不同になります。t.Start()コードが続行する前にスレッドでの作業が完了するように、 の後に待機を導入するにはどうすればよいですか? スレッドを手動で作成するよりも、BeginInvoke/EndInvoke の方が適切なオプションでしょうか?

4

3 に答える 3

15

スレッドにどのくらいの順序を課す必要がありますか? コードを続行する前に、ループ内で開始されたすべての作業を終了する必要があるだけで、ループ内の作業が終了する順序は気にしない場合は、Join を呼び出すことが答えです。Kevin Kenny の回答に詳細を追加するには、ループのでJoin を呼び出す必要があります。これは、開始したスレッドへの参照を保持するコレクションが必要になることを意味します。

// Start all of the threads.
List<Thread> startedThreads = new List<Thread>();
foreach (...) {
  Thread thread = new Thread(new ThreadStart(MyMethod));
  thread.Start();
  startedThreads.Add(thread);
}

// Wait for all of the threads to finish.
foreach (Thread thread in startedThreads) {
  thread.Join();
}

対照的に、ループ内で Join を呼び出した場合、結果は基本的にスレッドをまったく使用しない場合と同じになります。ループ本体の各反復は、スレッドを作成して開始しますが、すぐに参加して終了するのを待ちます。

個々のスレッドがなんらかの結果を生成する場合 (たとえば、ログにメッセージを書き込む)、スレッド間の調整がないため、メッセージは依然として順不同で表示されることがあります。スレッドを Monitor と連携させることで、スレッドに順番に結果を出力させることができます。

于 2008-08-10T08:37:28.383 に答える
5

スレッドの終了を待つもう 1 つの方法は、AutoResetEvent.

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false);

private void Blah()
{
    ThreadStart tStart = new ThreadStart(MyMethod);
    Thread t = new Thread(tStart);
    t.Start();

    //... (any other things)
    mWaitForThread.WaitOne();
}

private void MyMethod()
{
     //... (execute any other action)
     mWaitForThread.Set();
}
于 2008-08-20T12:54:56.200 に答える
4

私がこれを正しく読んでいるなら、あなたは一連のスレッドで作業項目を開始していますが、スレッドが順不同で完了していることを懸念しており、各スレッドが開始された順序で完了するまで待ちたいですか?

この場合、ワークアイテムごとにスレッドを作成する理由がわかりません。たぶん、あなたは拡大することができますか?

スレッドが完了するのを待つ必要がある場合は、次のようにします。

t.Join();
于 2008-08-09T22:32:07.840 に答える