2013-08-23 55 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

相关问题