System.Lazy的这个实现有什么问题?

时间:2012-10-01 18:32:23

标签: c# .net .net-3.5 outlook-addin

这是一个很好的类,它实现了.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)?

0 个答案:

没有答案