.NET の非同期例外

.NET での非同期例外は,しばしば悲劇をもたらす悪魔の使いとして登場します.
(id:NyaRuRu:20050320:p2)で紹介した例は,戻り値を変数に代入する直前に非同期例外が発生することで,ハンドル情報を失ってしまうというものでした.

IntPtr myFileHandle = NativeMethods.FindFirstFile(fullPath, data);

この問題の解決方法はいくつか存在します.

  1. out/ref を用いて関数からの return と変数への代入の順序を入れ替える
  2. マネージ型によるラッパークラスと Finalizer の改良で対処する
  3. 非同期例外の発生を抑制する.

このうち(2)と(3)にあたるものが,.NET Framework 2.0 で導入される CriticalFinalizer であり,Constrained Execution Region (CER) です.もちろんこの問題以外にも応用はありますけどね.
最近読んだ中では以下の記事が参考になりました.
Atomicity and asynchronous exception failures