5749


マルチスレッドで実行中のメソッド（voidメソッド）の内で、スレッドを終了させる方法がないか調査しています。

マルチスレッドの外側からならば、.Abort()でスレッドを強制終了することが出来るのですが、  
内側で自スレッドを終了させる方法がまだ分かっていません。

分かる方がいましたらご教授をお願いします。


CC BY-SA 3.0
2015-02-02T04:34:54.863
5743
2015-02-02T05:49:05.277
2015-02-02T04:50:35.833
7626
7626
question
c#
マルチスレッドで実行中のメソッドの内で、スレッドを終了させる方法


単にreturnするだけではダメですか？  
それがスレッド自身がスレッドを終わらせるということの意味だと思いますが。


CC BY-SA 3.0
2015-02-02T04:39:58.020
5745
2015-02-02T04:39:58.020
3496
5743
answer


returnすれば終了します。usingブロックやfinally句を実行するためにも途中で強制的に終了させるようなことは考えるべきではありません。


CC BY-SA 3.0
2015-02-02T04:41:04.977
5746
2015-02-02T04:41:04.977
4236
5743
answer


> 内側で自スレッドを終了させる方法がまだ分かっていません。

該当メソッドから`return`することで、自スレッド処理を終了させることができます。

> マルチスレッドの外側からならば、`.Abort()`でスレッドを強制終了することが出来る

マルチスレッド・プログラム中で、あるスレッドから他スレッドを強制終了させる操作は、デッドロックやリソースリークを引き起こす危険性があります。よほどの特殊事情が無い限り、外部からの
**強制** 終了は避けるべきです。危険性に関する詳細は
[`Thread.Abort`メソッド](https://msdn.microsoft.com/ja-jp/library/ty8d3wta.aspx)
の解説も参照ください（個人的には、絶対に利用すべきでないというくらい危険視しています）。別スレッドの強制終了方法として、もうすこし挙動が穏やかな
[`Thread.Interrupt`メソッド](https://msdn.microsoft.com/ja-
jp/library/system.threading.thread.interrupt.aspx) も存在します。

安全に他スレッドを終了させるには、例えば「終了フラグ」のようなものを用意し、あるスレッドからは終了 **要求**
を出し、自スレッドでは定期的に該当フラグをチェックして自発的に終了するという実装方法がシンプルです。この設計は「Two-Phase
Terminationパターン」とも呼ばれます。

なお、C#ではこのような複数スレッドから同時に書き込み／参照が行われる変数を、`lock`構文などで排他制御するか`volatile`変数とする必要があります。


CC BY-SA 3.0
2015-02-02T05:15:00.950
5749
2015-02-02T05:30:44.143
2015-02-02T05:30:44.143
49
49
5743
answer


どのような理由で終了させたいかわかりませんが、スレッドの強制終了は、危険です。  
予期しない状態で終了することにより、データ破壊等の障害が発生する可能性があります。  
また、リソースを解放せずに終了し、データベース、ファイル、ネットワークなどのシステムに  
影響を与える危険性が考えられます。

また余談ですが、Threadクラスによるスレッド制御よりもTaskの使用を検討すべきです。  
一般的にスレッドの生成は、コストが掛かります。  
長期間、稼働し続けるような場合を除いて、短時間で終わる程度の処理に関しては、  
Taskを使用すべきです。

Taskであれば、 **System.Threading.CancellationToken** を使用して、  
安全にバックグラウンドの処理をキャンセルすることが可能です。


CC BY-SA 3.0
2015-02-02T05:49:05.277
5751
2015-02-02T05:49:05.277
2207
5743
answer