SqlConnection.OpenAsync不适用于.net 4.5 ^

时间:2013-08-27 19:34:31

标签: ado.net

我有一个带有这样签名的方法:

internal async static Task<string> Get()
{
   var SqlCon = await InitializeConnection();
   return "Foo";
}

我这样称呼这个方法:

var x = Get().Result;

其他方法的说明

internal async static Task<SqlConnection> InitializeConnection()
{
        SqlConnection sc;
        sc = new SqlConnection();            
        sc.ConnectionString = @"Data Source=.\MSSQL;Initial Catalog=MyDB;Integrated Security=True;Async=True";                                  
         await sc.OpenAsync();//on this line the program long waits and doesn't connect

        return sc;
    }  

我使用不同的正确连接线检查而不使用异步并且一切正常。怎么解决?谢谢。

1 个答案:

答案 0 :(得分:2)

您可能使用Result导致死锁。您应该使用await代替。

我解释一下deadlock in detail on my blog。实质上,有许多上下文(例如UI或ASP.NET上下文)只允许一次执行单个线程。默认情况下,await将捕获上下文并在该上下文中恢复async方法的其余部分。因此,通过调用Result(同步)阻止该上下文中的线程,您将阻止async方法完成。