等待Task.WhenAll(tasks)异常处理,记录任务中的所有异常

姆扎戈尔斯基

我试图从下面的代码中找出如何报告任务列表抛出的所有异常。

此代码段的基本思想是:用户向处理程序发送请求,处理程序创建消息tasks并将其发送到将其发送到外部系统的类。我在下面列出了涉及的方法。

我必须关闭某些程序,因为我正在调试异常处理程序,并且任务Exception始终为null,因为Waiting for Activiation除非我在断点上停留的时间足够长,否则它们的状态似乎一直为空

// Handle the user request
public async void Handle(WriteScanToSys settings)
{
  _successfulScanIds = new List<int>();

  // create the messages as tasks
  var tasks = _factory.CreateMessage(settings).Select(msg => SendScans(msg));

  try
  {
    // wait for all of them to complete
    await Task.WhenAll(tasks); // I had ConfigureAwait(false) here, but took it off
  }
  catch (Exception)
  {
    foreach (var task in tasks.Where(t => t.Exception != null))
    {
      // ELMAH
      var errorLog = ErrorLog.GetDefault(null);
      errorLog.Log(new Error(task.Exception));
    }
  }

  // save to repository
}

// the task to perform
private async Task<IDictionary<string, object>> SendScans(IDictionary<string, object> data)
{
  object sysMsg = null;
  var response = await _msgCenter.SendMessage(data);
  response.TryGetValue("SystemMessage", out sysMsg);
  _successfulScanIds.Add(Convert.ToInt32(data["Id"]));
  return response;
}

// the communication with the external system (The message center class)
private async Task<IDictionary<string, object>> SendMessage(IDictionary<string, object> msg)
{
  var response = new Dictionary<string, object>();

  var response = await _client.sendAsync(
                          new BodyOfRequest(
                              // Compose Object
                          ));

  if (response.ScreenMessage != "SUCCESSFUL")
    throw new CustomException("The transaction for job " + job + " failed with msg: " + body.ScreenMessage);

  response.Add("SystemMessage", body.ScreenMessage);

  return response;
}
乔恩·斯基特

您已经懒惰地进行评估了-Select每次迭代时,的结果都会创建一组新的任务。您可以通过以下方法解决此问题ToList()

var tasks = _factory.CreateMessage(settings)
                    .Select(msg => SendScans(msg))
                    .ToList();

这样,您正在等待的任务集将与通过foreach循环检查的任务集相同

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等待带有异常处理的所有任务的完成

来自分类Dev

等待Task.WhenAll不等待所有任务完成

来自分类Dev

使用Task.WaitAll()处理等待的任务?

来自分类Dev

Task.WhenAll中的AggregateException仅在等待时包含第一个异常

来自分类Dev

无需等待的任务异常处理

来自分类Dev

Task.WhenAll-不等待子任务完成

来自分类Dev

等待新的Task <T>(...):任务不运行?

来自分类Dev

Task <TResult> .Result vs等待任务

来自分类Dev

Task.Wait()不等待任务完成

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

Task.WaitAll没有在等待-解释

来自分类Dev

使用等待处理任务中的 C# 异常

来自分类Dev

在Task.WhenAll中捕获异常

来自分类Dev

等待List <Task>中的所有任务完成时显示进度

来自分类Dev

等待的任务无法正常处理异常

来自分类Dev

Moq在对Task.WhenAll的调用中的任务之一中引发异步异常

来自分类Dev

等待任务抛出异常

来自分类Dev

是否在C#.NET中等待Task.WhenAll阻塞?

来自分类Dev

Task.ContinueWith()父任务不等待子任务完成

来自分类常见问题

等待与task.Result相同的已完成任务?

来自分类Dev

任务返回值,不带Task <T>(异步/等待模式)

来自分类Dev

如何等待直到Task.ContinueWith内部任务完成

来自分类Dev

在使用Task.Run()创建的任务上调用等待

来自分类Dev

如何等待create_task()创建的任务完成?

来自分类Dev

任务返回值,不带Task <T>(异步/等待模式)

来自分类Dev

在使用Task.Run()创建的任务上调用等待

来自分类Dev

等待一些任务完成(Task.WhenSome)

来自分类Dev

Rails:如何记录耙任务中引发的所有异常

Related 相关文章

热门标签

归档