1

これは、.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 をターゲットにしてビルドされたものです) でしょうか?

4

0 に答える 0