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