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