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 框架版本兼容性问题(这是针对 3.5 构建的)?

4

0 回答 0