【问题标题】:Getting deadlock when using ExecuteReaderAsync使用 ExecuteReaderAsync 时出现死锁
【发布时间】:2023-04-09 10:06:01
【问题描述】:

我正在尝试使用异步模式来执行 SQL 命令并返回一个 DataTable。 有人可以建议如何解决这个问题吗?

这是我的代码:

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

最好的问候, 托马斯

【问题讨论】:

  • 你确定这是一个死锁,而不仅仅是服务器连接超时?
  • 你怎么知道你有死锁?您可能连接到错误的服务器、连接速度较慢或返回的数据过多。如果您使用同步方法,该方法是否有效?
  • 您需要描述“死锁”。这也是 SQL Server 可以生成的异常。我怀疑这是真正的问题。
  • 当作为同步调用运行时,我会在一两秒后得到响应。当以异步方式运行时,一切都会停止。调试时,它停止的行是读入SqlDataReader时

标签: c# .net-4.5 deadlock async-await c#-5.0


【解决方案1】:

我怀疑您正在使用WaitResult 进一步提高您的调用堆栈。这个causes a deadlock 如果从 UI 线程调用,正如我在博客中描述的那样。

【讨论】:

  • 即使在“100% 确定”不使用任何结果之后,我还是发现它隐藏在我的代码中。谢谢...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多