これは、.Net 4.0 の System.Lazy のサブセットを実装する優れたクラスです。しばらくは問題なく動作していましたが、今日、奇妙なことが起こりました。以下の InvalidOperationException は、Lazy.Value.get が、例外をスローしていたフレームを除いてコール スタック (または他のスレッド) に見つからない場合にスローされました。
public class Lazy<T>
{
readonly object _locker = new object();
Func<T> _func;
T _value;
bool _busy;
public Lazy(Func<T> func)
{
if (ReferenceEquals(func, null))
throw new ArgumentNullException("func");
_func = func;
}
public bool IsValueCreated { get { return _func == null; } }
public T Value
{
get
{
if (_func != null)
lock (_locker)
if (_busy)
throw new InvalidOperationException("Function evaluation recursed back into Value.get on the same thread.");
else if (_func != null)
{
_busy = true;
try
{
_value = _func();
_func = null;
}
finally { _busy = false; }
}
return _value;
}
}
}
これはどのように起こりますか?finally{}
ブロックをスキップする方法はありますか? でのブレークポイント_busy=true
はヒットしませんでした。_busy
デフォルトにする方法はありますtrue
か?
これは、Addin Express を使用した Office 2007 統合の最中に発生しています。安全でないライブラリが Lazy のビットをいじっている可能性がありますか、それとも .Net Framework バージョンの互換性の問題 (これは 3.5 をターゲットにしてビルドされたものです) でしょうか?