2013-01-03 35 views
13

は、私はだから私はちょうど私がスレッドを終了したい場合、私はsmt.Abort() かでそれを行うべきでお願いしたかったC.C#でスレッドを終了するには?

にスレッドに関するいくつかのことを知って、C#のでスレッドに私の運を試してみたかったです関数が終了した後に "自分自身を殺す"でしょうか?

また、C#でCにpthread_exit()のようなものがありますか?

私の英語のために残念です。 :)

+0

通常、スレッドは実際に終了する「実行方法自体を使い切って実行する」ことをお勧めします。 –

+1

どのバージョンの.NETを使用していますか? – dotNETbeginner

+0

スレッドを終了するのは面倒ですが、自殺は通常ありません。 pthread_exit()と同様です。 Thread.CurrentThread.Abort()。それほど役に立ちません。 –

答えて

47

Thread.Abortは、スレッドを「殺す」だろうが、これはほぼ同等である:

シナリオ:あなたはそれを点灯、コンピュータにダイナマイトをストラップ、実行:あなたは

ソリューションをお使いのコンピュータの電源をオフにしたいです。

それは設定し、いずれかのCancellationTokenSource.Cancelを経由して、「終了条件」をトリガするためにはるかに良いですいくつかのブール値など「実行されている」、とThread.Joinを呼び出す(安全にアクセスします)。これは、より多くのようなものです:

シナリオ:あなたは、あなたのコンピュータ

ソリューションをオフにする:あなたは、開始をクリックしシャットダウンし、コンピュータの電源を切るまで待ちます。

+6

'CancellationTokenSource'を' System.Threading.Thread'オブジェクトに渡す方法はありますか? – AaA

+4

そのダイナマイトの類推:P。 +1 – RBT

+0

@AaA:[**パラメータ**](https://msdn.microsoft.com/en-us/library/6x4c42hc(v = vs.110).aspx)として渡します。 –

3

(スレッドの外側から)スレッドを外部で終了することは悪い考えです。非同期でスレッドを終了したときにスレッドが何をしているのかは決して分かりません。 C#では、スレッド関数が返ってきた場合、スレッドは終了します。

このMSDNの資料How to: Create and Terminate Threads (C# Programming Guide)には、参考になるサンプルコードがいくつかあります。

+0

あなたが示唆していることはクールで受け入れられる、しかし、どのようにあなたはスレッドを "それを閉じて今、話す私の方向です"と尋ねる? – AaA

+0

具体的に何を意味するかわかりません。スレッド化されたコードを書くほとんどの人は、スレッド内で実行されるループに、スレッドのループが規則的な方法でチェックしてシャットダウンできる外部信号を与えます。特定のシナリオを念頭に置いている場合は、詳細をつけて質問を投稿する必要があります。 – MikeB

+0

あなたは間違いなしです。私は同じことをしますが、時には(例えば)リスニングソケットが読み込みループに詰まり、ループから抜け出してあなたの指示を聞きたくない場合があります。これらの場合、Thread.Abort()は最後の手段です物事を修正する。いくつかのデータが失われるかもしれませんが、少なくともあなたのプログラムはクラッシュしないように保存しました。 – AaA

1

機能が終了したらスレッドを手動で終了する必要はありません。

あなたは方法は、スレッドが自動的にシャットダウンされます戻ったら、メソッドを実行するスレッドを産卵した場合には、実行するために、さらには何もしていて。*

あなたはもちろん、手動により、スレッドを中止することができます単純にAbort()を呼び出しますが、スレッドが現在の実行状態にある場所が信頼できないと判断されるため、潜在的なスレッド状態の破損のために推奨されません。あなた自身のスレッドの殺害を処理する必要がある場合は、CancellationTokenを使用することをお勧めします。また、MSDNのCancellation of Managed Threadsの記事を読むこともできます。

**つまり、あなたがあなたの仕事を実行するためにThreadPoolを使用している場合を除きます。これらのスレッドは、キューに入れられたさまざまなタスク間で再利用されるため、中断する心配はありません。

+0

ポートを無期限にリッスンしているソケットリスナースレッドをどのように終了しますか?ところで、私はスレッドのクラスCancellationTokenを受け入れていないと思う? – AaA

+0

@AaA私の答えで2番目に参照されたリンクを見てください。それはあなたに 'CancellationToken'の例を与えます。 –

+0

'CancellationToken'を' System.Threading.Thread'クラスで使用できますか?静的なブール変数のように振る舞うのではないですか? – AaA

0
Thread.Abort() 
Thread.Join(); 
Thread = null; 
関連する問題