2009-03-02 5 views
2

私はいつもこのようなイベントハンドラで正常な終了の間で疑ってるのスレッドの実行中止:ThreadAbortExceptionの

int result = WaitHandle.WaitAny(handles); 
if (result = WAIT_FINALIZE) 
    FinalizeAndExit(); 

をしてスレッドを知らせるためにイベントを使用して私は通常、それ以来、ThreadAbortExceptionのアプローチを使用するに傾いている

か、単にスレッドを完成させるためにThreadAbortExceptionの取り扱い...

try 
{ 
    // Main execution 
} 
catch(ThreadAbortException e) 
{ 
    // FinalizeAndExit(); 
} 
finally 
{ 
} 

を終了する必要がありますcatchブロックの終わりに再生成され、スレッドが "危険な"メソッドによって生き残ってしまうのを防ぎますが、私は両方のアプローチを見てきました。

あなたの意見は? 1つを別のものに使うのが最善の状況はありますか?それとも常にアプローチxを使うのがベストですか?

答えて

5

一般に、第1の方法が好ましい。

ThreadAbortExceptionを正常に処理するコードを書くのは難しいことではありませんが、難しくありません。例外は、スレッドが何らかの処理を行っている途中で発生することがあります。そのため、状況によっては処理が難しい場合があります。

たとえば、FileStreamオブジェクトを作成した後、その参照が変数に代入される前に例外が発生する可能性があります。つまり、オブジェクトを処分する必要がありますが、スタックへの唯一の参照はスタックのどこかで失われています。

+0

一方、私がスレッドを中止しないと、スレッドは私の主な実行をブロックするだけで生き残ってしまうことは決してありません。 –

+0

+1。 「実際には、スレッドアボートの例外は純粋に緩和されていないものであり、決して使用しないでください。 -C#コンパイラチームのメンバーEric Lippert http://blogs.msdn.com/ericlippert/archive/2009/03/06/locks-and-exceptions-do-not-mix.aspx –

+0

@JorgeCórdoba、背景を設定することができますあなたがアプリケーションを終了させることができない場合は、アプリケーションが終了したときにそのスレッドが終了します。 – Guffa

2

私はThread.Abortを使用しないでください。 Thread.Abortの問題は、実行中のコードの(ほとんどの)行で発生する可能性があり、「面白い」動作(バグを読む)を引き起こす可能性があることです。 Inteadイベントや変数をチェックして、スレッドが実行を停止して正常に終了するかどうかを確認する、コード上の終了点を持つことをお勧めします。

2

終了イベントが予想される場合、それは例外ではありません(厳密なしたがって、最初の方法を使用する必要があります。優雅な出口は、あなたが支配していることも示しています。

例外は有用であり、場合によっては過度に使用される可能性があります。

関連する問題