我正在尝试使我的基本存储库类异步,但我遇到了一些麻烦。我在我的 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/