2013-08-27 32 views
2

工作,我有這樣的簽名的方法:SqlConnection.OpenAsync不會在.NET 4.5^

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

我檢查了不同的正確的連接線,而不使用異步和一切工作。如何解決它?謝謝。

回答

2

您可能會因使用Result而導致死鎖。您應該使用await

我解釋了這個deadlock in detail on my blog。實質上,有許多上下文(例如UI或ASP.NET上下文)只允許一次執行單個線程。默認情況下,await將捕獲一個上下文,並在該上下文中恢復其餘的方法async。因此,通過調用Result(同步)阻止該環境中的線程,可以防止完成async方法。

+0

我指定了「await Get()」,但現在因此我收到了「System.Threading.Tasks.Task'1 [System.String]」這一行。 –

+1

聽起來像你使用MVC 3?在ASP.NET上,您必須使用.NET 4.5,並在您的web.config中將「targetFramework」設置爲4.5。 –