我正在为我在WebAPI项目中使用的所有SQL基类添加异步实现。我对TAP范式还不太熟悉,仍在学习中。
我知道,在ASP.NET上下文中通过Task.Run()来生成线程没有任何性能优势,所以我对我的实现格外小心。
我已将我的QueryExecutor方法更改为以下异步实现。但是无法确定加载DataTable的最佳方法。我猜想最好使用reader.ReadAsync()来填充DataTable,但似乎在.NET 4.5框架中没有可用的内容。
因此,我想问一下,是否值得编写自己的扩展方法,例如DataTable.LoadAsync(DbDataReader reader)?如果可以避免,我不太想这样做,因为它不像受控的.Net代码那样完美可靠。
请告诉我你们的想法。
我知道,在ASP.NET上下文中通过Task.Run()来生成线程没有任何性能优势,所以我对我的实现格外小心。
我已将我的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;
}
}
}
谢谢
DataTable
。 - Stephen Cleary