c# - 查找并行异步任务的结果

标签 c# asp.net .net async-await

基于 this question我正在尝试设置代码以将多个图像并行保存到 Azure Blob 存储。下面的这个方法工作正常并等待 Task.WhenAll(tasks) 在继续之前等待所有完成。

唯一的麻烦是,我希望能够查明每个将信息存储到我们数据库中的请求是否真的成功了。 _db.AddImageAsync 返回一个 bool 值,下面的代码等待所有任务完成,但是当我检查所有任务的结果时,每个任务都是假的(即使我实际上在括号内返回了真)。

Enumerable 中的每个任务都表示尚未计算结果,即使我通过断点逐步执行并且每个任务都已执行。

  var tasks = wantedSizes.Select(async (wantedSize, index) =>
  {
    var resize = size.CalculateResize(wantedSize.GetMaxSize());
    var quality = wantedSize.GetQuality();

    using (var output = ImageProcessHelper.Process(streams[index], resize, quality))
    {
        var path = await AzureBlobHelper.SaveFileAsync(output, FileType.Image);
        var result = await _db.AddImageAsync(id, wantedSize, imageNumber, path);
        return result;
    }
  });

  await Task.WhenAll(tasks)

  if (!tasks.All(task => task.Result))
      return new ApiResponse(ResponseStatus.Fail);

非常感谢任何帮助!

最佳答案

因为 .Select(被延迟评估并返回 IEnumerable<Task<bool>>你造成了 .Select(当您多次迭代结果时要运行多次。扔一个.ToList()在它上面使它成为List<Task<bool>>那只会执行 .Select(一次和多次枚举将超过返回的 List<Task<bool>>不会有副作用。

  var tasks = wantedSizes.Select(async (wantedSize, index) =>
  {
    var resize = size.CalculateResize(wantedSize.GetMaxSize());
    var quality = wantedSize.GetQuality();

    using (var output = ImageProcessHelper.Process(streams[index], resize, quality))
    {
        var path = await AzureBlobHelper.SaveFileAsync(output, FileType.Image);
        //Double check your documentation, is _db.AddImageAsync thread safe?
        var result = await _db.AddImageAsync(id, wantedSize, imageNumber, path);
        return result;
    }
  }).ToList(); //We run the Select once here to process the .ToList().

  await Task.WhenAll(tasks) //This is the first enumeration of the variable "tasks".

  if (!tasks.All(task => task.Result)) //This is a 2nd enumeration of the variable.
      return new ApiResponse(ResponseStatus.Fail);

关于c# - 查找并行异步任务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33830212/

相关文章:

c# - 如何在 C# Windows 应用程序中使用 Microsoft Edge WebView2 控件

c# - 带有 MVC4 的 Newtonsoft JSON 无法转换参数类型

c# - 从 CodeBehind 文件调用 JS 函数

c# - 如何在C#中重新加载U盘?

c# - 如何在 LINQ to 实体表达式中使用 CreateDateTime

c# - 如何卸载使用 RunAndCollect 创建的动态程序集?

c# - Entity Framework 和 Firebird DB 方言 1 - 不生成兼容的 sql

c# - INSERT INTO 语句的问题

asp.net - ASPNET5类库抛出当前运行时目标框架与 '<ProjectName>'不兼容

c# - 检查 list1 内容是否与 list2 内容匹配