【问题标题】:Exception log in Parallel.ForEach [duplicate]Parallel.ForEach 中的异常日志 [重复]
【发布时间】:2018-09-13 08:48:43
【问题描述】:

我尝试了以下代码

    void Main()
{
     List<int> list = new List<int>(new int[]{ 1,2,3,4,5,6,7 });
    try
    {
        Parallel.ForEach<int>(list, i => PrintEven(i));
    }
    catch(AggregateException ex)
    {
        Console.WriteLine( ex);
    }
}

private static void PrintEven(int data)
{
    try
    {
        if(data%2 != 0)
        {
            throw new Exception($" {data} Not Even");
        }
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);
        throw;
    }
}

PrintEven 方法的“catch”块不会打印所有奇数。这意味着 catch 块的 Console.Writeline 并不总是被执行。

当我从 PrintEven 方法的“catch”块中删除“throw”时,代码会打印所有奇数。

问题:

  1. 为什么从 catch 块中抛出异常会导致这种不一致?
  2. 如何在 catch 块中记录一些附加信息并抛出异常?

TIA。

【问题讨论】:

  • 这是意料之中的。未处理的异常会导致循环立即终止。您的 parallel foreach 循环的某些任务可能已执行,有些则没有。

标签: c# parallel.foreach


【解决方案1】:

实际上,您的代码可以正常工作,因为并行将使进程在多线程中运行,它不会破坏主线程并停止整个过程。您可能会发现的唯一问题是顺序将是随机的。 1.根据我的理解,你不应该在catch中抛出异常。原因,如果没有 try catch 块来处理你放入 catch 中的这个抛出,那么你的整个程序就会中断。 2.异常类里面有很多属性,比如CallStack和InnerException,可以帮助你更深入的识别错误。如果你想记录,可以使用很多 nuget 包,一个著名的例子是 NLog。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多