代码之家  ›  专栏  ›  技术社区  ›  Charles Bretana

例外情况。网络线程池线程

  •  4
  • Charles Bretana  · 技术社区  · 16 年前

    How to catch exceptions from a ThreadPool.QueueUserWorkItem?


    我正在排队等候多名代表。Net ThreadPool用于大量独立的远程处理调用,这些调用本身调用多个数据库和其他脱机资源。通过在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
    }
    

    但是整个批处理需要以事务方式处理,也就是说,只有在所有子线程都成功的情况下,才允许父线程的输出继续进行。我已经将子线程编码为在失败时抛出自定义异常,但我发现这会导致父线程崩溃,因为这些异常无法在父线程中“捕获”。..

    3 回复  |  直到 8 年前
        1
  •  3
  •   Simon P    16 年前

        2
  •  2
  •   Reed Copsey    16 年前

        3
  •  1
  •   Thomas    16 年前