【问题标题】:Boolean Include Task Canceled Exception while doing Parallel.Foreach in C#在 C# 中执行 Parallel.Foreach 时布尔包含任务取消异常
【发布时间】:2017-08-11 10:36:21
【问题描述】:

我有一个奇怪的情况,我无法找到以下堆栈跟踪的错误来源:

Message :One or more errors occurred.<br/>
StackTrace :   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.Wait()
   at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
   at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body)

代码本身是一个简单明了的 Parallel.Foreach 循环,其逻辑如下:

Parllel.Foreach(_collection, new ParallelOptions { MaxDegreeOfParallelism =5 }, item=>
{
// code inside
});

这个问题的根源是什么?你们有什么建议给我我应该在哪里寻找?

@mortb 这是我记录堆栈跟踪异常的方式:

  string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Error.txt";

            using (StreamWriter writer = new StreamWriter(filePath, true))
            {
                writer.WriteLine("Message :" + ex.Message + "<br/>" + Environment.NewLine + "StackTrace :" + ex.StackTrace +
                   "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
                writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
            }

【问题讨论】:

  • 调试并查看抛出的异常属性InnerExceptions(注意InnerExceptions中的s)外部异常只是“// code inside”抛出的一个或多个异常的包装器实际的异常列在InnerExceptions
  • @mortb 这是困扰我的问题.. 我无法将异常写入文本文件...等等,我会告诉你我如何记录错误..
  • @mortb 你能看到我更新的问题吗?这就是我记录异常本身的方式......有什么方法可以记录内部异常本身并查看哪一行抛出它?

标签: c# asp.net .net asp.net-mvc parallel.foreach


【解决方案1】:

对日志记录的建议更改:

string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Error.txt";

using (StreamWriter writer = new StreamWriter(filePath, true))
{
      foreach(var inner in (ex as AggregateException).?InnerExceptions ?? (new [] {ex}))
      {
           writer.WriteLine("Message :" + inner.Message + "<br/>" + Environment.NewLine + "StackTrace :" + inner.StackTrace +
           "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
           writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
      }
}

【讨论】:

  • Mortb,非常感谢!现在就试试代码:)
  • 它说的是前任。不包含名为 InnerExceptions 的属性,而仅包含 1 个名为“InnerException”的单一形式的属性
  • 可能您已将异常捕获为catch (Exception ex),然后它丢失了类型,我添加了代码以将其强制转换为 AggregateException(未测试)代码不是最佳的,但它可能会工作跨度>
【解决方案2】:

您的// code inside 正在引发异常。您看到的异常是 Parallel.For 循环杀死其工作任务以正确关闭。通常ForEach 函数最后应该抛出一个异常,该异常包含错误的实际原因。您看到的错误看起来像是调试器触发了 ForEach 函数的内部异常。

【讨论】:

  • 非常感谢您的回复!我已经用我如何记录异常本身更新了我最初的问题......有什么方法可以记录内部异常本身吗?
  • 异常类型应该是AggregateException。如果你投到这个,你会得到一个属性InnerExceptions(注意“s”)。此列表中的例外之一就是您要查找的例外。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多