.NET マルチスレッド待機機構の詳細説明
.NET でマルチスレッドを扱う場合、特にメイン UI スレッドと組み合わせる場合、スレッドの実行順序を管理することが重要です。この記事では、あるスレッドが別のスレッドの完了を待機させるためのいくつかの戦略を検討します。
この必要性は、あるスレッド (メイン UI スレッドなど) が続行する前に別のスレッドがタスクを完了するのを待つ必要がある場合に発生します。この動作を実現するには複数の方法があります:
1. スレッド.参加:
<code>Thread t1 = new Thread(new ThreadStart(action1)); t1.Start(); t1.Join();</code>
Thread.Join は、指定されたスレッド (この例では t1) が実行を完了するまで、呼び出し元のスレッド (この場合はメイン UI スレッド) をブロックします。この方法はシンプルで簡単ですが、UI がフリーズする可能性があります。
2. 待機ハンドル:
<code>ManualResetEvent resetEvent = new ManualResetEvent(false); Thread t1 = new Thread(new ThreadStart(() => { // 执行任务并在完成时发出信号 resetEvent.Set(); })); t1.Start(); resetEvent.WaitOne(); // 阻塞直到 resetEvent 发出信号</code>
WaitHandles (ManualResetEvent など) は、よりきめ細かい制御を提供します。ここでは、resetEvent を使用してスレッド t1 の完了を示します。メインスレッドは、イベントが設定されるまで WaitOne() をブロックし、実行を継続できます。
3. イベント:
<code>ThreadWorker worker = new ThreadWorker(); worker.ThreadDone += HandleThreadDone; Thread t1 = new Thread(worker.Run); t1.Start(); void HandleThreadDone(object sender, EventArgs e) { // 线程 `t1` 完成时执行操作 }</code>
イベントは、スレッドが完了ステータスを通信する方法を提供します。 ThreadWorker は、タスクの完了後にイベントを発生させ、その後、HandleThreadDone メソッドで処理されます。
4. 参加者:
<code>ThreadWorker worker = new ThreadWorker(); Thread t1 = new Thread(worker.Run); t1.Start(HandleThreadDone); void HandleThreadDone() { // 线程 `t1` 完成时执行操作 }</code>
デリゲートを使用して、メソッドをパラメータとしてスレッドに渡すことができます。 ThreadWorker がタスクを完了すると、デリゲート HandleThreadDone が呼び出され、メイン スレッドが実行を継続できるようになります。
5. 非同期プログラミング:
Task キーワードや async/await キーワードを使用したデリゲートやイベント ハンドラーの使用など、非同期プログラミング手法を使用して、スレッドのブロックを回避し、実行フローを効率的に管理できます。
スレッド同期の処理:
イベントまたはデリゲートを使用する場合は、スレッドの同期を必ず考慮してください。イベント/デリゲート ハンドラー メソッドは、必ずしもメイン UI スレッドではなく、イベントを発生させた/デリゲートを呼び出したスレッドで実行される場合があります。ユーザー インターフェイスを更新するには、Invoke または InvokeRequired を使用してメイン UI スレッドでハンドラー メソッドを呼び出す必要がある場合があります。
以上が.NET で 1 つのスレッドを別のスレッドを待機させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。