私は C# でのスレッド化で運試しをしたかったのですが、C でのスレッド化についていくつかのことを知っています。
それで、スレッドを終了したいかどうかを尋ねたかったのですが、それを行うべきですか、smt.Abort()
それとも関数の終了後に「自分自身を殺す」のでしょうか?
また、 pthread_exit()
C#にCのようなものはありますか?
私は C# でのスレッド化で運試しをしたかったのですが、C でのスレッド化についていくつかのことを知っています。
それで、スレッドを終了したいかどうかを尋ねたかったのですが、それを行うべきですか、smt.Abort()
それとも関数の終了後に「自分自身を殺す」のでしょうか?
また、 pthread_exit()
C#にCのようなものはありますか?
Thread.Abort
スレッドを「kill」しますが、これは以下とほぼ同じです:
シナリオ: コンピューターの電源を切りたい
解決策: ダイナマイトをコンピューターに固定し、火をつけて走ります。
を介して「終了条件」をトリガーする方がはるかに優れていCancellationTokenSource.Cancel
ます(安全にアクセスされた)「実行中」のboolなどを設定し、 を呼び出しThread.Join
ます。これはもっと似ています:
シナリオ: コンピューターの電源を切りたい
解決策: [スタート] をクリックしてシャットダウンし、コンピューターの電源が切れるまで待ちます。
関数が終了したら、手動でスレッドを終了する必要はありません。
メソッドを実行するためにスレッドを生成した場合、メソッドが返されると、スレッドはそれ以上実行するものがないため、自動的にシャットダウンされます。
もちろん、 を呼び出すだけで手動でスレッドを中止することもできますがAbort()
、これは、スレッドが現在の実行状態のどこにあるかの信頼できない決定によるスレッド状態の破損の可能性があるため、ほとんどお勧めできません。スレッドの強制終了を自分で処理する必要がある場合は、CancellationTokenの使用を検討するのが最適です。また、MSDN のCancellation of Managed Threads記事を読むこともできます。
** つまり、ThreadPool を使用して作業を実行している場合を除きます。これらのスレッドはキューに入れられたさまざまなタスクで再利用されるため、これらのスレッドの中止について心配する必要はありません。
スレッドを外部で (スレッドの外から) 終了するのは悪い考えです。スレッドを非同期で強制終了すると、スレッドが何をしていたのかわかりません。C# では、スレッド関数が戻ると、スレッドは終了します。
この MSDN の記事「方法: スレッドの作成と終了 (C# プログラミング ガイド)」には、参考になるメモとサンプル コードが含まれています。
Thread.Abort()
Thread.Join();
Thread = null;