查找并行异步任务的结果

本文关键字:结果 任务 异步 并行 查找 | 更新日期: 2023-09-27 18:22:50

基于这个问题,我正在尝试设置代码,以便将多个映像并行保存到Azure Blob存储。下面的方法工作良好,正在等待任务。WhenAll(tasks)等待所有人完成后再继续。

唯一的问题是,我想知道在我们的数据库中存储信息的每个请求是否真的成功了_数据库。AddImageAsync返回一个bool,下面的代码等待所有任务完成,但当我检查所有任务的结果时,每个任务都是false(即使我在括号内实际返回true)。

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);