基于 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/