我正在为我的WebAPI项目中使用的所有SQL基类添加异步实现。我对TAP范例相当陌生,所以我仍然在学习。异步填充C#数据表
我知道,由于其他职位,产生一个线程通过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;
}
}
}
感谢, 保罗
只是sidenode:您的示例代码是受管理的.Net代码 –
通常,异步代码使用Entit y框架查询而不是'DataTable's。 –
我确实使用EF 6.但是有时候您只需要执行一个SP并将结果作为DataTable使用。 – Sal