[英]Using BeginExecuteNonQuery with async tasks
我正在为基础存储库添加一些方法,以处理将处理使用异步任务的查询的其他代码。 我基本上只是在现有的BeginExecuteNonQuery和EndExecuteNonQuery方法周围包装一个Task 。
使用这样的方法有什么陷阱吗? 在AsyncCallback中执行SQL语句期间捕获发生的异常是否正确?
public class Repo
{
public class SqlCommandAsyncState<T>
{
public SqlCommand SqlCommand { get; set; }
public TaskCompletionSource<T> TaskCompletionSource { get; set; }
public SqlCommandAsyncState()
{
TaskCompletionSource = new TaskCompletionSource<T>();
}
}
private int? sqlCommand_EndExecuteNonQuery(SqlCommand sqlCommand, IAsyncResult result)
{
try
{
return sqlCommand.EndExecuteNonQuery(result);
}
catch (Exception ex)
{
// LogError(LogImportance.Fatal, ex);
}
finally
{
sqlCommand.Connection.Dispose();
}
return null;
}
private void sqlCommand_ExecuteNonQueryForIntCompleted(IAsyncResult result)
{
SqlCommandAsyncState<int?> state = result.AsyncState as SqlCommandAsyncState<int?>;
state.TaskCompletionSource.SetResult(sqlCommand_EndExecuteNonQuery(state.SqlCommand, result));
}
private void sqlCommand_ExecuteNonQueryForBoolCompleted(IAsyncResult result)
{
SqlCommandAsyncState<bool?> state = result.AsyncState as SqlCommandAsyncState<bool?>;
int? rowsAffected = sqlCommand_EndExecuteNonQuery(state.SqlCommand, result);
state.TaskCompletionSource.SetResult(rowsAffected.HasValue ? (bool?)(rowsAffected.Value > 0) : null);
}
public async Task<bool?> UpdateAsync(string commandText, SqlParameter[] parameters)
{
SqlCommandAsyncState<bool?> state = new SqlCommandAsyncState<bool?>();
SqlConnection sql_Connection = new SqlConnection(ConnectionString);
try
{
sql_Connection.Open();
state.SqlCommand = new SqlCommand(commandText, sql_Connection);
state.SqlCommand.CommandType = CommandType.StoredProcedure;
state.SqlCommand.Parameters.AddRange(parameters);
state.SqlCommand.BeginExecuteNonQuery(new AsyncCallback(sqlCommand_ExecuteNonQueryForBoolCompleted), state);
}
catch (Exception ex)
{
// LogError(LogImportance.Fatal, ex);
state.TaskCompletionSource.SetResult(null);
}
return await state.TaskCompletionSource.Task;
}
public async Task<int?> UpdateWithCountAsync(string commandText, SqlParameter[] parameters)
{
SqlCommandAsyncState<int?> state = new SqlCommandAsyncState<int?>();
SqlConnection sql_Connection = new SqlConnection(ConnectionString);
try
{
sql_Connection.Open();
state.SqlCommand = new SqlCommand(commandText, sql_Connection);
state.SqlCommand.CommandType = CommandType.StoredProcedure;
state.SqlCommand.Parameters.AddRange(parameters);
state.SqlCommand.BeginExecuteNonQuery(new AsyncCallback(sqlCommand_ExecuteNonQueryForIntCompleted), state);
}
catch (Exception ex)
{
// LogError(LogImportance.Fatal, ex);
state.TaskCompletionSource.SetResult(null);
}
return await state.TaskCompletionSource.Task;
}
}
Task.Factory.FromAsync
旨在做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.