查找并行异步任务的结果

Jam*_*ndy 3 .net c# asp.net async-await

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

唯一的麻烦是,我希望能够找出每个在我们的数据库中存储信息的请求是否真的成功了._db.AddImageAsync返回一个bool,下面的代码等待所有任务完成,但是当我检查所有任务的结果时,每个都是假的(即使我在括号内实际返回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);
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢!

Sco*_*ain 6

因为.Select(是惰性求值并返回a IEnumerable<Task<bool>>,所以.Select(当你多次迭代结果时,你会导致多次运行.抛出.ToList()它使它成为a 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);
Run Code Online (Sandbox Code Playgroud)

  • +1,并澄清:一切都返回false的原因是`AddImageAsync`可能在第二次用相同的ID调用时返回`false`,因为第二次没有关于图像的任何改变. (2认同)