【发布时间】:2018-07-10 23:38:54
【问题描述】:
我在尝试并行运行一堆 linq 查询时遇到了我认为的死锁。
我在这个方法上运行Task.WhenAll():
public async Task<MetabuildScan> GetLatestMetabuildScanAsync(string buildId)
{
var metabuildScanStatuses = new[] { "Completed", "Referenced" };
// Get the latest metabuild scan for this image build
var latestScan = await (from scan in _qsaContext.MetabuildScans
where scan.SoftwareImageBuildId == buildId
&& metabuildScanStatuses.Contains(scan.SIScanStatus)
orderby scan.SIScanStartedOn descending
select scan).FirstOrDefaultAsync();
// If there is a related scan, then use that one, else, use the one we just got
var latestCompletedScanId = latestScan?.RelatedScanId ?? latestScan?.Id;
return await _qsaContext.MetabuildScans
.FirstOrDefaultAsync(scan => scan.Id == latestCompletedScanId);
}
我收到了System.InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.
_qsaContext 是使用 Entity-Framework Core 创建的。
起初,我认为FirstOrDefaultAsync 可以解决我的问题(我一开始有一个非异步的FirstOrDefault),但它没有。
我想知道解决这个僵局的最佳解决方案是什么。我从中选择的表是一个大表,所以我无法将整个表拉到内存中。
【问题讨论】:
标签: linq asynchronous async-await entity-framework-core