【发布时间】:2017-12-19 16:26:00
【问题描述】:
我正在向我的 WebAPI 项目中使用的所有 SQL 基类添加 async 实现。我对 TAP 范式还很陌生,所以我还在学习。
我知道,感谢其他帖子,通过 Task.Run() 生成线程在 ASP.NET 上下文中没有任何性能优势。所以我对我的实现要格外小心。
我已将我的 QueryExecutor 方法更改为下面的异步实现。但无法弄清楚加载 DataTable 的最佳方式是什么。我猜我最好使用reader.ReadAsync() 来填充DataTable,但.NET 4.5 框架中似乎没有任何可用的东西。
所以我想问是否值得编写我自己的扩展方法,例如DataTable.LoadAsync(DbDataReader reader)?如果可以提供帮助,我有点不想这样做,因为它不会像托管的 .Net 代码那样万无一失。
让我知道你们的想法。
private async Task<DataTable> ExecuteQueryInternalAsync(string commandText, CommandType commandType, SqlConnection sqlConnection, SqlTransaction transaction, params SqlParameter[] parameters)
{
using (SqlCommand cmd = new SqlCommand(commandText, sqlConnection) { CommandType = commandType, CommandTimeout = this.config.MainConnectionTimeoutInSeconds })
{
if (transaction != null)
cmd.Transaction = transaction;
if (parameters != null)
{
foreach (var parameter in parameters)
{
if (parameter != null)
{
if (parameter.Value == null)
parameter.Value = DBNull.Value;
cmd.Parameters.Add(parameter);
}
}
}
if (sqlConnection.State == ConnectionState.Closed)
await sqlConnection.OpenAsync();
using (var reader = await cmd.ExecuteReaderAsync())
{
//Want to use: reader.ReadAsync()
var tb = new DataTable();
tb.Load(reader);
return tb;
}
}
}
谢谢
【问题讨论】:
-
只是一个侧节点:您的示例代码是托管的 .Net 代码
-
一般来说,异步代码使用实体框架查询而不是
DataTables。 -
我确实使用 EF 6。但有时您只需要执行 SP 并将结果作为 DataTable 获取。
标签: c# .net sql-server datatable async-await