c# - 在 ASP.NET 中异步填充数据集或数据表的最佳做法是什么?

标签 c# asynchronous ado.net dataadapter

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

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 中编写它?

最佳答案

在 ASP.NET 中,使用 Task.Run 几乎无济于事。它究竟会改善什么?它只会引入开销。

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

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

关于c# - 在 ASP.NET 中异步填充数据集或数据表的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25558715/

相关文章:

c# - WPF 有哪些 "growl"类型的通知窗口(出现并在 X 秒后消失的窗口)?

javascript - 异步递归函数结束后的回调

c# - 使用 ADO.NET SqlDataAdapter 更新单个记录

asynchronous - Kivy 异步图像 - 静态 Google API 未加载

java - 来自 servlet 的 Java 异步处理

c# - 使用 SqlCommandBuilder 时出现异常 "Incorrect syntax near ' System'"

asp.net - 将 ThreadPool 线程与长时间运行的 ADO.NET 查询一起使用。这是可扩展的吗?

c# - 在 UWP 的 gridview 中检索 JSON 数据

c# - SOAP 消息反序列化

c# - WPF 使用 SelectedIndex 从 ViewModel 中选择 ListBox 中的项目