gpt4 book ai didi

c# - 是什么导致这个特定方法死锁?

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:19 25 4
gpt4 key购买 nike

尽我所能,我一直选择异步。但是,我仍然坚持使用不是为异步构建的 ASP.NET 成员资格。因此,我对 string[] GetRolesForUser() 等方法的调用无法使用异步。

为了正确构建角色,我依赖于来自各种来源的数据,因此我使用多个任务来并行获取数据:

public override string[] GetRolesForUser(string username) {
...
Task.WaitAll(taskAccounts, taskContracts, taskOtherContracts, taskMoreContracts, taskSomeProduct);
...
}

所有这些任务都只是使用 Entity Framework 从 SQL Server 数据库中获取数据。但是,最后一个任务 (taskSomeProduct) 的引入导致了死锁,而其他方法都没有。

这里是导致死锁的方法:

public async Task<int> SomeProduct(IEnumerable<string> ids) {
var q = from c in this.context.Contracts

join p in this.context.Products
on c.ProductId equals p.Id

where ids.Contains(c.Id)

select p.Code;

//Adding .ConfigureAwait(false) fixes the problem here
var codes = await q.ToListAsync();
var slotCount = codes .Sum(p => char.GetNumericValue(p, p.Length - 1));

return Convert.ToInt32(slotCount);
}

但是,此方法(看起来与所有其他方法非常相似)不会导致死锁:

public async Task<List<CustomAccount>> SomeAccounts(IEnumerable<string> ids) {
return await this.context.Accounts
.Where(o => ids.Contains(o.Id))
.ToListAsync()
.ToCustomAccountListAsync();
}

我不太确定导致死锁的方法是什么。最终他们都在做同样的查询数据库的任务。将 ConfigureAwait(false) 添加到一个方法确实解决了这个问题,但我不太确定它与其他执行良好的方法有什么区别。

编辑

下面是一些额外的代码,我最初为简洁起见省略了这些代码:

public static Task<List<CustomAccount>> ToCustomAccountListAsync(this Task<List<Account>> sqlObjectsTask) {
var sqlObjects = sqlObjectsTask.Result;
var customObjects = sqlObjects.Select(o => PopulateCustomAccount(o)).ToList();
return Task.FromResult<List<CustomAccount>>(customObjects);
}

PopulateCustomAccount 方法只是从数据库 Account 对象返回一个 CustomAccount 对象。

最佳答案

ToCustomAccountListAsync 中调用 Task.ResultThat's a classic deadlock.使用 await

关于c# - 是什么导致这个特定方法死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com