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

标签 c# .net asynchronous async-await dapper

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

相关文章:

c# - 通过索引号 wpf mvvm 在 listview itemsource 中搜索值

c# - 具有公共(public)字段的不同类之间的 IEnumerable.Except()

c# - 私有(private)方法与本地函数

javascript - 为什么这个异步函数无法返回任何数据?

asynchronous - 在 Dart 中获取非阻塞 stdin 数据

c# - List的实现是什么?

c# - 用C#在两个进程之间进行通信的最简单方法是什么?

.net - 如何列出 GAC 中所有已注册的程序集?

.net - 如何在TopShelf中指定服务的命令行选项

c++ - 使用异步boost asio代码进行同步操作