TPL:发生一个或多个错误

时间:2014-03-05 09:34:15

标签: c# task-parallel-library

环境:C#,VS2010,.NET 4.0

我的错误信息如下。但是,如果我尝试再运行一次,那么它可以工作。我要检查它为什么会这样工作。你能评论一下吗?

  • 运行应用程序。
  • 执行tplTest方法。
  • 发生错误
  • 执行tplTest方法。
  • 它有效。

错误讯息:

[9008]错误Form1 :: tplTest错误:MESASGE [发生一个或多个错误。]
[9008]消息来源[mscorlib]
[9008] TRACE [Location:System.Threading.Tasks.Task.WaitAll(Task [] tasks,Int32 millisecondsTimeout,CancellationToken cancellationToken)

代码段

private void tplTest(List<string> listFileNames)
      {
          try
          {
              var exceptions = new ConcurrentQueue<Exception>();

              List<Task<TResult>> tasks = new List<Task<TResult>>();

              foreach (string item in listFileNames)
              {
                  Task<TResult> t_MethodA = Task.Factory.StartNew<TResult>(tpSharpness, item);
                  tasks.Add(t_MethodA);
              }

              try
              {
                  Task.WaitAll(tasks.ToArray()); // <-- Error Occurred

                  foreach (Task<TResult> item in tasks)
                  {
                      if (item.IsCompleted)
                      {
                          TResult _result = item.Result;
            // TODO Something
                          //...
                      }
                  }
              }
              catch (Exception e)
              {
                  exceptions.Enqueue(e);
              }

              if (exceptions.Count > 0)
                  throw new AggregateException(exceptions);              
          }
          catch (AggregateException exception)
          {
              foreach (Exception ex in exception.InnerExceptions)
                  log.AddErrorLog(this.Name, MethodBase.GetCurrentMethod().Name, string.Format("Error: MESASGE[{0}]\r\nSOURCE[{1}]\r\nTRACE[{2}]", ex.Message, ex.Source, ex.StackTrace));
          }
      }

     private TResult tpSharpness(object arg)
      {
          SharpnessTask _tpSharp = new SharpnessTask();
          return _tpSharp.Task();
      }

1 个答案:

答案 0 :(得分:0)

您需要抓住AggregateException周围try catch的{​​{1}}。这是抛出聚合异常的地方。

一旦捕获并处理了异常,您就可以转到代码的下一部分和Task.WaitAll(tasks.ToArray());循环。