我有一个带有这样签名的方法:
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;
}
我使用不同的正确连接线检查而不使用异步并且一切正常。怎么解决?谢谢。
答案 0 :(得分:2)
您可能使用Result
导致死锁。您应该使用await
代替。
我解释一下deadlock in detail on my blog。实质上,有许多上下文(例如UI或ASP.NET上下文)只允许一次执行单个线程。默认情况下,await
将捕获上下文并在该上下文中恢复async
方法的其余部分。因此,通过调用Result
(同步)阻止该上下文中的线程,您将阻止async
方法完成。