gpt4 book ai didi

.net - .Net ThreadPool 线程的异常

转载 作者:行者123 更新时间:2023-12-04 10:56:20 28 4
gpt4 key购买 nike

重复:How to catch exceptions from a ThreadPool.QueueUserWorkItem?

我在 .Net ThreadPool 上为大量独立的远程调用排队多个委托(delegate),这些调用本身调用多个数据库和其他离线资源。通过在 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 的信息,但是我需要在这些子线程排队和产生的方法中“处理”这个异常,以根据 child 的成功控制立即的下游处理threeads... 我该怎么做呢?

最佳答案

如果线程失败,您可以在 CompleteAndQueuePayLoads 函数的局部变量中标记至少发生一次失败,并添加异常/失败变量以供稍后检查。

关于.net - .Net ThreadPool 线程的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668265/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com