gpt4 book ai didi

c# - 在 async/await 上阻塞主线程

转载 作者:行者123 更新时间:2023-11-30 14:50:00 26 4
gpt4 key购买 nike

我正在尝试使我的基本存储库类异步,但我遇到了一些麻烦。我在我的 C# 应用程序中使用 Dapper ORM。

基本方法

protected async Task<List<T>> Read<T>(CommandDefinition cmd) {
using(SqlConnection myCon = new SqlConnection(Config.DBConnection)) {
await myCon.OpenAsync();

IEnumerable<T> results = await myCon.QueryAsync<T>(cmd);

List<T> retVal = results.ToList();

myCon.Close();

return retVal;
}
}

调用方法

public List<Category> GetAllActiveCategories(Guid siteGuid) {
return base.Read<Category>(SPNAME_GETALLACTIVE, siteGuid).Result;
}

在我看来一切都井井有条。我有用 async 关键字修饰的方法声明。我正在等待异步方法。

我遇到的问题是 await myCon.OpenAsync(); 上的线程阻塞。这是我第一次尝试使用 async 和 await,所以我确定我做错了什么,但并不明显。请帮忙!

最佳答案

发布的阅读代码很好。问题出在消费代码中。如果您在返回的 Task 或其上调用 Wait()Result ,则 async 会导致死锁调用链中的先行 Task

在这些情况下,一般建议适用:don't block on async code .一旦开始使用 async/await,就应该在整个调用链中使用 async/await

所以,你的调用方法变成了

public Task<List<Category>> GetAllActiveCategoriesAsync(Guid siteGuid) {
return base.Read<Category>(SPNAME_GETALLACTIVE, siteGuid);
}

...或者

public async Task<List<Category>> GetAllActiveCategoriesAsync(Guid siteGuid) {
List<Category> result = await base.Read<Category>(SPNAME_GETALLACTIVE, siteGuid);

// Do something.

return result;
}

关于c# - 在 async/await 上阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37849315/

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