2

次のようなシグネチャを持つメソッドがあります。

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;
    }  

非同期を使用せずに、さまざまな正しい接続回線でチェックしたところ、すべてが機能しました。それを修正する方法? ありがとうございました。

4

1 に答える 1

2

を使用してデッドロックを引き起こしている可能性がありResultます。await代わりに使用する必要があります。

このデッドロックについては、ブログで詳しく説明しています。本質的に、一度に 1 つのスレッドしか実行できないコンテキスト (UI や ASP.NET コンテキストなど) が多数あります。デフォルトでawaitは、コンテキストをキャプチャし、そのコンテキストで残りのasyncメソッドを再開します。そのため、 を呼び出してそのコンテキストでスレッドを (同期的に) ブロックすることで、メソッドの完了Resultを妨げています。async

于 2013-08-27T19:39:03.573 に答える