相关:如何从 ThreadPool.QueueUserWorkItem 中捕获异常?
我在由ThreadPool.QueueUserWorkItem()启动的后台线程中捕获异常,并通过共享实例变量将它们传播到主线程。
后台线程这样做:
try
{
... stuff happens here...
}
catch (Exception ex1)
{
lock(eLock)
{
// record only the first exception
if (_pendingException == null)
_pendingException = ex1;
}
}
_pendingException 有多个潜在的编写者——多个后台线程——所以我用锁保护它。
在主线程中,我必须在阅读之前获得锁_pendingException
吗?或者我可以简单地这样做:
if (_pendingException != null)
ThrowOrHandle();
编辑:
ps:我宁愿不锁定读者线程,因为它在热路径上,我会非常非常频繁地获取和释放锁定。