6

に設定されているSystem.Timers.Timerタイマーがあります。私はそれの終わりにタイマーを保証するためにを使用します(私は実行の重複を防ぐためにこのようにタイマーを使用します)。コード:AutoResetfalsetry/finallyStartcallbackcallback

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

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

4

5 に答える 5

7

公式ソース...

スレッドを破棄するためにAbortメソッドが呼び出されると、共通言語ランタイムはThreadAbortExceptionをスローします。ThreadAbortExceptionはキャッチできる特別な例外ですが、catchブロックの最後で自動的に再度発生します。この例外が発生すると、ランタイムはスレッドを終了する前にすべてのfinallyブロックを実行します。スレッドはfinallyブロックで無制限の計算を実行するか、Thread.ResetAbortを呼び出して中止をキャンセルできるため、スレッドが終了する保証はありません。中止されたスレッドが終了するまで待機する場合は、Thread.Joinメソッドを呼び出すことができます。参加は、スレッドが実際に実行を停止するまで戻らないブロッキング呼び出しです。

詳細については、MSDNをご覧ください。

于 2011-05-23T15:33:22.500 に答える
4

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

于 2011-05-23T15:32:29.387 に答える
4

ドキュメントを引用します(強調鉱山):

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

スレッドがすぐに中止されること、またはまったく中止されることは保証されていません。この状況は、スレッドが中止手順の一部として呼び出されるfinallyブロックで無制限の量の計算を実行し、それによって中止を無期限に遅らせる場合に発生する可能性があります。スレッドが中止されるまで待機するには、Abortメソッドを呼び出した後、スレッドでJoinメソッドを呼び出すことができますが、待機が終了する保証はありません。

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

于 2011-05-23T15:33:15.960 に答える
1

はい、finallyどのように終了してもtry、常に使用されます。

catchはステートメントブロックで発生する例外を処理するために使用されますが、
 最後に、コードのステートメントブロックが関係なく実行されることを保証するために使用されます
 前のtryブロックがどのように終了するかについて。

詳細については、MSDNをご覧ください。

于 2011-05-23T16:28:59.447 に答える
1

スレッドがすでに中止されている場合、catchブロックとfinallyブロックは実行を継続できます。

system.threadingクラスでどのように処理されるかを明確に把握するには、このリンクを参照してください 。ThreadAbortExceptionの深さの配管

于 2013-06-22T19:21:20.747 に答える