2014-10-17 105 views
3

当运行此:SqlConnection.OpenAsync()挂起

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

它挂在connection.OpenAsync()线。

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

我在做什么错?

+1

我的猜测是你的连接字符串是错误的。 – 2014-10-17 18:55:23

+0

你等了多久? – usr 2014-10-17 20:42:01

+1

1)如果你打开一个正常的打开,它会工作吗? 2)它是否锁定在'await Task.Delay(1000);'如果你把它放在'using'语句之前?如果对于这两个问题是肯定的,你的问题与SQL无关,你真正的问题在http://stackoverflow.com/questions/14485115/synchronously-waiting-for-an-async-operation-and-why-does- wait-freeze-the-pro – 2014-10-17 21:25:13

回答

5

问题不在于连接。问题是我在自己的线程中发现了一个死锁,而我自己在脚下开枪。我试图拨打电话到包含connection.OpenAsync()线同步调用的方法如下:

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

通过调用task.Wait()我被阻塞的线程。当await connection.OpenAsync()返回时,方法的其余部分想要在我刚被阻塞的同一个线程上运行,所以任务永远不会结束,并且task.Wait()永不返回。

解决办法:
因为在我的异步方法我没有什么要求我坚持调用它的同一个线程,我只是用await connection.OpenAsync().ConfigureAwait(false),使之运行的方法的其余部分在其他不同的线程比我用task.Wait()阻止的那个。