ThreadAbortException は、finally (try/catch) セクションのコードの実行を強制しますか?

StackOverflow https://stackoverflow.com/questions/6099382

質問

私は持っています System.Timers.Timer タイマー、それはどれですか AutoReset に設定されています false. 。私は try/finally 私を保証するために Start 終わりのタイマー callback (私はタイマーをこのように使用して、時間の重複を防ぎます) callback 実行)。コード:

// inside timer call back
try
{
    // Do something
}
finally
{
    timer.Start(); // Is this line always executed?
}

私の質問は、実行中のスレッドが次の場合に何が起こるかです。 Aborted?しますか? finally セクションはまだ実行されていますか、それともその部分を実行するスレッドがありませんか?

役に立ちましたか?

解決

はい、その行は常に実行され、finally句のコードが終了するまでアボートはブロックされました。

他のヒント

公式出所...

中止に電話がかけられたとき スレッドを破壊する方法、一般的な 言語ランタイムはAをスローします ThreadaBortException。 ThreadAbortExceptionは特別です 捕獲することができる例外、しかしそれ 自動的に再び上げられます キャッチブロックの終わり。このとき 例外が発生し、ランタイム 前に最後にすべてのブロックを実行します スレッドを終了します。糸があるからです では、無制限の計算を実行できます 最後にブロックまたは呼び出します AbortをキャンセルするThread.Resetabort、 スレッドが保証されていません これまでに終わります。あなたが待っているならば 中止されたスレッドが終了するまで、 thread.joinメソッドを呼び出すことができます。 結合はブロックコールではありません スレッドが実際に停止するまで戻ります 実行

msdn

クォート ドキュメンテーション (私の強調):

このメソッドがスレッド上で呼び出されると、システムはスレッド内で ThreadAbortException をスローしてメソッドを中止します。ThreadAbortException は、アプリケーション コードによってキャッチできる特別な例外ですが、ResetAbort が呼び出されない限り、catch ブロックの最後で再スローされます。ResetAbort は中止要求をキャンセルし、ThreadAbortException によるスレッドの終了を防ぎます。 未実行のfinallyブロックは、スレッドが中止される前に実行されます。

スレッドがすぐに中止されるか、まったく中止されるかは保証されません。この状況は、スレッドが次の処理を実行した場合に発生する可能性があります。 中止プロシージャの一部として呼び出される、finally ブロック内の無制限の計算量, 、その結果、中止が無期限に遅延します。スレッドが中止されるまで待機するには、Abort メソッドを呼び出した後にスレッドで Join メソッドを呼び出すことができますが、待機が終了するという保証はありません。

したがって、答えは「はい」です。finally ブロックが実行されます。

はいfinallyから常にどのように出るかに関係なく、常に使用されます。

 Whereas catch is used to handle exceptions that occur in a statement block, 
 finally is used to guarantee a statement block of code executes regardless 
 of how the preceding try block is exited.
.

それを読む msdn

スレッドが既に中止されている場合は、キャッチブロックと最後のブロックは実行を続けることができます。

System.Threadingクラスでどのように処理されるかについて明確な絵を得るためにこのリンクを参照してください。 threadabortexception

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top