没有活动连接时,SqlConnection.OpenAsync()会挂起

时间:2014-10-17 18:37:00

标签: sql-server ado.net

当我运行时:

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

它挂在connection.OpenAsync()行。

如果我在Sql Server Management Studio中查看数据库有多少个活动连接,那么只有一个:可能是此代码使用的连接。所以,我不确定我是否正在从应用程序池中耗尽连接。

我做错了什么?

2 个答案:

答案 0 :(得分:12)

问题不在于连接。问题是我在自己的脚上开枪自杀了。我试图调用包含connection.OpenAsync()行的方法进行同步调用,如下所示:

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

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

解决方案:
因为在我的异步方法中,我没有要求我坚持使用调用它的同一个线程,我只是使用await connection.OpenAsync().ConfigureAwait(false),使它在不同的线程中运行方法的其余部分而不是我阻塞的线程{ {1}}。

答案 1 :(得分:1)

它可能挂起的另一个原因是因为实现不好。 OpenAsync(CancellationToken)甚至没有在Open操作中使用取消令牌,因此您实际上无法取消它。您必须等待它超时。如果您在调用该方法时已经设置了cancelestToken,那么它所做的就是返回一个已取消的任务,您无需进行任何特殊的实现即可检查自己。因此,这种“异步”过载实际上是没有用的。

enter image description here