在ASP.NET中异步填充数据集或数据表的最佳做法是什么
本文关键字:数据表 最佳 是什么 数据集 NET ASP 异步 填充 | 更新日期: 2023-09-27 18:20:05
给定以下代码,我对最佳实践有几个问题:
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更好,后者感觉更灵活、更具体(只在异步任务上使用wait)。
对Fill()方法调用Task.Run()的方法是否比包装整个代码块更好?
在Task.Run()中调用Fill()是否有任何负面副作用?如果Fill()出现错误,我会丢失调用堆栈和/或异常信息。
有没有更好的方法在ASP.NET中编写它?
在ASP.NET中,使用Task.Run
几乎没有任何帮助。它究竟会改善什么?它只会带来开销。
也就是说,Fill
将执行IO(排出数据读取器),因此可能希望异步调用它。不幸的是,这个方法没有异步版本。
如果您坚持使用异步IO(这对于数据库访问来说是有问题的),则需要找到替代方案。也许异步实体框架或原始ADO.NET可以帮助您。
您是否尝试过使用DataReader和新的ExecuteReaderAsync?我记得SqlDataAdapter已经在内部使用了一个没有async的DataReader。如果可能的话,您可能还希望完全跳过使用DataTable,以减少一些开销。
对于很少更改此类查询模式列的小型结果集,我可能会以多种方式之一将其缓存在web服务器上。见鬼,对于模式更改,您甚至可以创建一个简单的DDL触发器来更新带有时间戳字段的单行表,让您知道已经进行了更改,然后只在必要时运行查询。对于模式表以外的表,另一个选项是CHECKSUM_AGG。