finally
呼び出されないが、アプリケーションがまだ実行されている可能性はわずかでもありますか?
そこでセマフォを解放しています
finally
{
_semParallelUpdates.Release();
}
それらのいくつかを失うことを恐れています。
たわごとがファンを襲った場合に呼び出される強力な保証があるのは、重要なファイナライザーだけです。この動作を取得するには、 CriticalFinalizerObjectまたはSafeHandleから継承でき ます。ただし、ファイナライザーに、信頼性の高い契約を結んでいるコードを呼び出す以外のことをさせることはお勧めしません。このコードは、たとえば、システムのメモリが不足している状況で実行できる必要があります。
重要なファイナライザーの実装は、アプリドメインがアンロードされている場合でも、未処理のすべてのリソースが確実にクリーンアップされるようにしたい場合にのみ必要です(たとえば)。もちろん、ファイナライザーが実行される保証はありません。停電の場合、あなたは運が悪いです。より多くの保証が必要な場合は、この動作を実現できる何らかのトランザクションシステム(データベースなど)が必要です。
コードの信頼性を高める方法をお探しの場合は、次の記事を読むことをお勧めします。
VinayCが推奨するもう1つの優れた記事は、次のとおりです。
Framework 1.0および1.1では、これは、現在ブロック内にあるスレッドがを使用して中止された場合に可能でした。フレームワークの現在のバージョンでは、私はそのようなケースを認識していません。finally
Thread.Abort
コードがに到達することが保証されていますfinally
か? はい(世界の終わりなどの大惨事が発生しない限り... または、コンピューターの電源が失われたり、OS がクラッシュしたりしない限り)。
ただし、コードを実行することが絶対に重要な場合は、コード自体が例外をスローしないようにすることをお勧めします。
たとえば、次のようにします。
IDisposable someDisposableObject = null;
IDisposable someOtherDisposableObject = null;
try
{
someDisposableObject = GetDisposableObject();
throw new Exception("Holy crap, something bad happened.");
someOtherDisposableObject = GetOtherDisposableObject();
}
finally
{
// This will throw a NullReferenceException...
someOtherDisposableObject.Dispose();
// ...so this actually won't run.
someDisposableObject.Dispose();
}
したがって、ブロック全体 を実行したい場合finally
は、例外が (理想的には) 発生しないように適切に記述することが重要です。
現在のスレッドは、「finally」ブロックが実行されるか、finally ブロック自体から例外がスローされない限り、現在のスタック フレームから離れません。スレッドが "try" ブロック内で停止またはブロックされた場合、実行は現在のスタック フレームから離れることはありませんが、最終的な "ブロック" も実行されません。
ホスト Windows オペレーティング システムは、キャッチされない致命的な例外の最悪のケースでもプログラムを終了します。しかし、その場合でもfinally
ブロックは確実に実行されます。