【发布时间】:2011-05-05 21:19:39
【问题描述】:
我正在尝试通过 .NET 的 Lazy 类初始化一个昂贵的对象,该对象可能由于异常而失败。惰性类的实例被缓存,因为在后续尝试初始化时可能会成功。因此,我按如下方式创建实例:
Lazy<someObject> lazyValue =
new Lazy<someObject>(() => { expensive initialization; },
System.Threading.LazyThreadSafetyMode.PublicationOnly);
根据带有 PublicationOnly 的 .NET 文档,该异常不会被缓存,因此可以尝试重新初始化该值。我遇到了无法捕获异常的问题。现在编写自己的惰性类相当简单,但我想知道我是否错误地使用了 .NET 的惰性类还是它们的错误?
以下(简化的)代码将重现该问题:
private static void DoesntWork()
{
int i = 0;
Lazy<string> lazyValue = new Lazy<string>(() =>
{
if (i < 2)
{
throw new Exception("catch me " + i);
}
return "Initialized";
}, System.Threading.LazyThreadSafetyMode.PublicationOnly);
for (; i < 3; i++)
{
try
{
Console.WriteLine(lazyValue.Value);
}
catch (Exception exc) // I do not catch the exception!
{
Console.WriteLine(exc.Message);
}
}
}
【问题讨论】:
-
它对我有用,打印
catch me 0 catch me 1 Initialized -
在我的机器上工作。在不调试的情况下运行它(CTRL-F5)
-
我试过用 Ctrl-F5 运行它,你的权利它确实可以工作,但现在有人知道为什么它在调试过程中不工作了吗?