在ASP.NET中异步填充DataSet或DataTable的最佳实践是什么?

Adr*_*ila 12 c# ado.net asynchronous 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经看到几个示例在Task.Run()调用中包装整个代码块,但我不确定这是否比仅为DataAdapter.Fill()方法调用Task.Run()更好更灵活和特定(仅使用等待异步任务).

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

在Task.Run()中调用Fill()有任何负面的副作用吗?如果Fill()有错误,我正在考虑丢失调用堆栈和/或异常信息的问题.

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

usr*_*usr 1

在 ASP.NET 中,使用Task.Run. 它具体会改善什么?它只会引入开销。

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

如果您坚持使用异步 IO(这对于数据库访问来说是有问题的),您需要找到替代方案。也许异步实体框架或原始 ADO.NET 可以帮助您。