【问题标题】:What is the best practice to fill a DataSet or DataTable asynchronously in ASP.NET?在 ASP.NET 中异步填充 DataSet 或 DataTable 的最佳实践是什么?
【发布时间】:2014-10-22 21:37:34
【问题描述】:

鉴于以下代码,我有几个关于最佳实践的问题:

string connectionString = @"Server=(local)\sqlexpress; Database=master; Integrated Security=true;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    using (SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from information_schema.columns", connection))
    {
        await connection.OpenAsync();

        DataTable dataTable = new DataTable();
        await Task.Run(() => dataAdapter.Fill(dataTable));
        return dataTable;
    }
}

我已经看到了几个将整个代码块包装在 Task.Run() 调用中的示例,但我不确定这是否比仅为 DataAdapter.Fill() 方法调用 Task.Run() 更好,感觉更加灵活和具体(仅在异步任务上使用 await)。

在 Fill() 方法上调用 Task.Run() 的方法是否比包装整个代码块更好?

在 Task.Run() 中调用 Fill() 是否有任何负面影响?如果 Fill() 出错,我正在考虑丢失调用堆栈和/或异常信息。

有没有更好的方法在 ASP.NET 中编写这个?

【问题讨论】:

  • 为什么不把 all 的代码放在异步方法中?也就是说,移动任务以包含整个 SQL 连接生命周期,包括填充 DataTable。
  • 这是 ASP.NET 还是 GUI?
  • @AdrianAnttila 无论如何,就异常处理而言,请参阅 - stackoverflow.com/questions/5383310/… 异常被维护并传播到 调用 await 的代码,就像上下文一样。跨度>
  • Task.Run 在 Web 应用程序中几乎没有帮助。它究竟会改进什么?
  • 它可以通过并行工作来提高请求的性能,并且它还创建了一个高度并发的服务器,因为您没有对该请求进行锁定,服务器可以继续接受其他请求而那个正在处理。所以我相信,如果使用得当,你在某些场景下会有优势。

标签: c# asynchronous ado.net dataadapter


【解决方案1】:

您是否尝试过使用 DataReader 和新的 ExecuteReaderAsync?我记得 SqlDataAdapter 已经在内部使用了 DataReader 而没有异步。如果可能的话,您可能还想完全跳过使用 DataTable 以减少一些开销。

对于很少更改此类查询模式列的小型结果集,我可能会以多种方式之一将其缓存在 Web 服务器上。哎呀,对于模式更改,您甚至可以创建一个简单的 DDL 触发器来更新带有时间戳字段的单行表,让您知道已经进行了更改,然后仅在必要时运行查询。对于模式表以外的表,另一个选项是 CHECKSUM_AGG。

【讨论】:

    【解决方案2】:

    在 ASP.NET 中,使用 Task.Run 几乎没有帮助。它究竟会改善什么?它只会引入开销。

    也就是说,Fill 将执行 IO(耗尽数据读取器),因此您可能想要异步调用它。不幸的是,这种方法没有异步版本。

    如果您坚持使用异步 IO (which is questionable for database access),您需要找到替代方案。也许异步实体框架或原始 ADO.NET 可以帮助您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-14
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多