Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向集合添加线程时TPL中的处理错误_C#_.net_Task Parallel Library_Async Await - Fatal编程技术网

C# 向集合添加线程时TPL中的处理错误

C# 向集合添加线程时TPL中的处理错误,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,我正在研究一个生产者-消费者模型,在该模型中,生产的每一项都在一个新的任务并行库线程上消费,并在列表中进行跟踪。我希望能够及时、可预测地捕获任何未经处理的异常。在一个循环中,我从集合中删除了完成的线程,并考虑了如下内容,但在网上没有看到任何关于这方面的内容 try { Task.WaitAll(threadList.FindAll(x => x.IsFaulted).ToArray()); } catch(AggregateException aex) { //Deal w

我正在研究一个生产者-消费者模型,在该模型中,生产的每一项都在一个新的任务并行库线程上消费,并在
列表中进行跟踪。我希望能够及时、可预测地捕获任何未经处理的异常。在一个循环中,我从集合中删除了完成的线程,并考虑了如下内容,但在网上没有看到任何关于这方面的内容

try
{
    Task.WaitAll(threadList.FindAll(x => x.IsFaulted).ToArray());
}
catch(AggregateException aex)
{
    //Deal with the exceptions and possibly kill the program
}

threadList.RemoveAll(x => x.IsCompleted);
由于在子线程中有良好的错误处理,除了OutOfMemoryException之类的异常之外,不应该有未处理的异常。如果发生这种情况,我想抓住它,优雅地死去


是否有更好的选择,甚至是我应该注意的设计?

您可能需要考虑使用<代码>任务。WaITON/<代码>在一个循环中(删除已完成的任务)而不是.< /P>
这样做的好处是在异常发生时向您显示异常情况(处理您的“及时”需求),而不是等待所有任务提前完成。

我会采取稍微不同的方法。 我会等待每个任务独立完成,随着任务的完成,列表会逐渐减少:

while (threadList.Count > 0)
{
     Task finishedTask;
     try
     {
          finishedTask = await Task.WhenAny(threadList);

         // More processing if needed.
     }
     catch (Exception e)
     {
         // Handle exception.
     } 
     finally
     {
           threadList.Remove(finishedTask);     
     }
}
请注意,通过这种方式,您可以捕获特定的异常,而不处理其他异常


作为旁注,请看一下。线程模型和异常传播将为您处理。

谢谢您的提示。我应该能够做到这一点,并期待在保持名单整洁方面做得更好。