复制:如何从 ThreadPool.QueueUserWorkItem 捕获异常? https://stackoverflow.com/questions/753841
我正在 .Net ThreadPool 上对多个委托进行排队,以进行大量独立的远程调用,这些调用本身会调用多个数据库和其他脱机资源。通过在线程池上对这些调用进行排队,我可以同时运行它们并最大限度地减少总体延迟。
private void CompleteAndQueuePayLoads(IEnumerable<UsagePayload> payLoads)
{
List<WaitHandle> waitHndls = new List<WaitHandle>();
foreach (UsagePayload uPyLd in payLoads)
{
ManualResetEvent txEvnt = new ManualResetEvent(false);
UsagePayload uPyLd1 = uPyLd ;
ThreadPool.QueueUserWorkItem(
delegate
{
if (!uPyLd1 .IsComplete)
// IEEDAL.GetPayloadReadings is long running DB call
try { IEEDAL.GetPayloadReadings(uPyLd1 ); }
catch (IEEAccessException iX)
{
log.Write(log.Level.Error,
"IEEWSDAL.CompleteAndQueuePayLoads " +
" Delegate Failed " +
iX.Message, iX);
txEvnt.Set();
throw; // this causes parent thread to crash!
// was going to try Thread.Abort next ...
// Thread.CurrentThread.Abort();
}
UsageCache.PersistPayload(uPyLd1 );
SavePayLoadToProcessQueueFolder(uPyLd1 );
txEvnt.Set();
});
waitHndls.Add(txEvnt);
}
util.WaitAll(waitHndls.ToArray()); //To waitone on > 64 waithandles
}
但是整个批处理需要以事务方式处理,即,只有在所有子线程都成功的情况下才需要允许父线程的输出继续进行。我已经对子线程进行了编码,使其在失败时抛出自定义异常,但我发现这会导致父线程崩溃,因为这些异常无法在父线程中“捕获”......
我已经阅读过有关发生这种情况时 CLR 抛出的 UnHandledExceptionEvent 的信息,但我需要在这些子线程排队和生成的方法中“处理”此异常,以根据子线程的成功来控制立即下游处理Threeads...我该怎么办?
如果线程失败,您可以标记 Complete AndQueuePayLoads 函数的局部变量中至少发生了一次失败,并添加异常/失败变量以供稍后检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)