【发布时间】:2016-02-23 03:34:49
【问题描述】:
基于this question,我正在尝试设置代码以将多个图像并行保存到 Azure Blob 存储。下面的这个方法工作正常,等待 Task.WhenAll(tasks) 在继续之前等待所有完成。
唯一的麻烦是,我希望能够查明每个将信息存储在我们数据库中的请求是否真的成功了。 _db.AddImageAsync 返回一个布尔值,下面的代码等待所有任务完成,但是当我检查所有任务的结果时,每个任务都是假的(即使我实际上在括号内返回了真)。
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);
非常感谢任何帮助!
【问题讨论】:
-
您似乎同时在多个线程中使用
_db,是否允许多个线程同时调用_db.AddImageAsync? (这根本与您的问题无关,但这是我看到很多人使用异步时犯的常见错误) -
好点,@ScottChamberlain - 我怀疑不是。我喜欢很多在我被赶上之前 - 它没有向数据库添加任何东西!出于兴趣,您知道当您尝试使用这样的非线程安全方法时,幕后究竟发生了什么吗?
-
不支持对多个并发请求使用 DbContext(即使请求都在同一个线程上进行)并且具有未定义的行为,因此您将收到 Nasal Demons(又名:任何事情都可能发生,它可以工作,它可能会引发错误,它可能看起来像是在工作,但是将损坏的数据放入您的数据库中,它可能会使守护进程飞出您的鼻子)
标签: c# asp.net .net async-await