sql-server - 当没有事件连接时,SqlConnection.OpenAsync() 挂起

标签 sql-server ado.net

当我运行这个时:

using(SqlConnection connection = new SqlConnection(connectionString)){
    await connection.OpenAsync();
}

它卡在 connection.OpenAsync() 行上。

如果我在 Sql Server Management Studio 中查看数据库的事件连接数,就会发现只有一个:可能是此代码使用的连接。因此,我不确定应用程序池的连接是否已用完。

我做错了什么?

最佳答案

问题根本不在于连接。问题是我的线程死锁,搬起石头砸自己的脚。我试图对包含 connection.OpenAsync() 的方法进行同步调用,像这样:

Task task = MyAsyncMethod();
task.Wait();

调用task.Wait()我阻塞了线程。当await connection.OpenAsync()返回,该方法的其余部分想要在我刚刚阻止的同一个线程上运行,因此任务永远不会完成并且 task.Wait()永远不会回来。

解决方案:
因为在我的异步方法中,我没有任何要求我坚持调用它的同一个线程,所以我只是使用 await connection.OpenAsync().ConfigureAwait(false) ,使其在与我用 task.Wait() 阻止的线程不同的线程中运行该方法的其余部分.

关于sql-server - 当没有事件连接时,SqlConnection.OpenAsync() 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431344/

相关文章:

sql - 使用 include 中的所有列创建索引是一种不好的做法吗?

php - SQL 中存储标签、类别和 int[] 的最佳方式

sql - 通过 Ado.net 连接向 Microsoft SQL 数据库文件发送收缩命令

C# Mysql - 在异步等待服务器的数据库查询上使用锁

sql - 在复制中处理标识列的最佳方法

sql-server - SQL Server 到 Hadoop 复制

SQL - 如何在where子句条件中添加计数

c# - 使用 DataReader 读取数百万数据时,如何避免数据库连接丢失问题?

c# - ADO .NET EF 中的可组合查询每次迭代返回更多实体

c# - 如何正确使用 SqlDataReader?