2013-08-23 81 views
2

我想使用異步模式來執行SQL命令並返回一個DataTable。 有人可以請教如何解決這個問題?使用ExecuteReaderAsync時出現死鎖

這是我的代碼:

private static async Task<DataTable> ExecuteAsync(Connections connection, SqlBuilder sql) 
    { 
     using (SqlConnection conn = new SqlConnection(GetConnectstring(connection))) 
     { 
      await conn.OpenAsync(); 
      using (SqlCommand cmd = new SqlCommand(sql.Query, conn)) 
      { 
       foreach (var parameter in sql.ColumnValues.Where(d => !d.Name.StartsWith("#"))) 
       { 
        cmd.Parameters.AddWithValue(parameter.Name, parameter.Value); 
       } 

       //Why am I getting a deadlock when executing the next line? 
       using (SqlDataReader reader = await cmd.ExecuteReaderAsync()) 
       { 
        DataTable dt = new DataTable(); 
        dt.Load(reader); 
        return dt; 
       } 
      } 
     } 
    } 

最好的問候, 托馬斯

+1

你確定這是一個死鎖,不只是在服務器連接上超時? – bradgonesurfing

+0

你怎麼知道你有一個僵局?您可能連接到錯誤的服務器,連接速度較慢或返回的數據太多。如果您使用同步方法,該方法是否工作? –

+0

你需要描述「死鎖」。這也是SQL Server可以生成的一個例外。我懷疑是真正的問題。 –

回答

10

我懷疑你使用WaitResult進一步您的通話棧。這個causes a deadlock如果從UI線程調用,就像我在博客上描述的那樣。

+0

即使在沒有使用任何Result的「100%確定」後,我發現它隱藏在我的代碼中。謝謝... – thomas

相關問題