查找并行异步任务的结果
本文关键字:结果 任务 异步 并行 查找 | 更新日期: 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);