2012-02-23 25 views
2

MSDNによれば、AppDomain.Unloadは、AppDomainのアンロード中のすべてのスレッドがスレッドの中断例外をスローするようにします。AppDomain.Unloadと関連するThreadAbortExceptionを処理する方法

ドメイン内のスレッドは、スレッド内でThreadAbortExceptionをスローするAbortメソッドを使用して終了されます。スレッド は即座に終了する必要がありますが、finally節では予測できないほどの時間が の間実行され続けます。 - MSDN

からだから私の理解は、このアプリケーションドメインで実行されることが予想されるたびに、私はどこにもコードを書いているということですが、私はスレッドアボートは、いつでも任意のスレッド上で発生する可能性があることを期待しなければなりません。これは本当ですか? どこのコードでも、いつでもThreadAbortExceptionをスローすることができるはずですか?

実際この事実elimatesキャッチ(例外の例)のAppDomainのアンロードが本当にないので、それは(ThreadAbortExceptionのをキャッチし、それを処理しようとすると、通常、実際に記録されるべきではないエラーのログを記録することであろうから例外)。

不必要な例外処理/エラーロギングを避けるために他の考慮事項がありますか?

答えて

2

ThreadAbortExceptionは処理できませんので、例外をキャッチする必要はありません。もっと技術的に

をキャッチすることができ、特別な例外はあるが、それが自動的にcatchブロックhereから

の終わりに再び上昇する ます。

+0

どこのコードでも、いつでもThreadAbortExceptionをスローすることができますか?また、ThreadAbortExceptionを処理するので、catch(Exception ex)を実質的に排除しますか?私の質問では、私はtry catchでハンドルを意味するわけではありませんでしたが、一般的にどのスレッドでスレッド例外をスローすることができるのかをコード化する必要があります – Mark

+1

それ自身の後でクリーンアップする必要がある作業は、パターン、場合によってはトランザクションが含まれます。しかし、ほとんどのコードはそれを必要としません。 – Aliostad

+2

実際には、catchブロックで 'Thread.ResetAbort()'を発行することによって、 'ThreadAbortException'をキャッチすることができます。 –

4

あなたはいつでもTAEの可能性に関して正しい予想を持っています。私が作る唯一のポイントは、あなたのコードはおそらく既にこのように書かれているはずです。信頼性の必要なデータを扱うときは、ハードウェア障害、オペレータエラー、OOMなどの場合にトランザクションやその他の補償メカニズムを使用する必要があります。 AppDomainのシャットダウンのシナリオに固有のものではありません。

最後に、がTAEをキャッチし、キャッチブロックで補償コードを実行することがわかっているはずです。彼らにとって特別なのは、キャッチブロックの後にすぐに再スローされるということだけです。そのため、あなたはそれらを「飲み込む」ことができません。 Thread.ResetAbort()を使用してそれらを抑制することはできますが、この場合はおそらく望ましい効果ではありません。

public void Foo() { 
    try { 
     Do.Some.Stuff(); 
    } catch (Exception ex) { 
     Console.Out.WriteLine("Oh noes!"); 
    } 
} 

をとはい、catchブロックは、何をeverything- TAEs、OOMs、スタックオーバーフローキャッチします:

我々は、すべてこのようなコードを書いています。ここで心に留めておくべきことは、上記のすべての例外に対して、世界は基本的に終わりであるということです。気にする必要があるのは、トランザクションで機密扱いのデータが失われたり、悪い状態に陥ったりすることがないということです。そのため、マイクロソフトとオラクルのスマートな人々にトランザクションセーフなI/O誰がデータベースを書きますか?あなたのコードがフラットファイルI/Oの場合は、が本当に確実であることが必要です。はファイルを悪い状態にすることはありません。非常に全体的な方法で失敗モードを考えるべきですこのファイルが半分書かれているときに電源が切れたら? "

+2

良い答え、おそらくそれを追加する必要があります:**あなたが使用しているすべてのアンマネージドリソース**のオブジェクトファイナライザ部分を含むIDisposableパターンを正しく実装する必要があります。 mutexを使用している場合など、これはシステム全体のロックを回避する唯一の方法です。 ThreadAbortExceptionがスローされると、最終ブロックとオブジェクトファイナライザが実行されますが、これが保存されます。私は恐怖を感じますか? **私はAM ** – Maghis

+0

一つの小さな修正。あなたが理解する限り、あなたは.Net 2以上で 'StackOverflowException'をキャッチすることはできません。自分で試して、[MSDN](http://msdn.microsoft.com/en-us/library/system.stackoverflowexception(v = vs.110).aspx)を参照してください。 –

関連する問題