如何在使用块中为块内的异步查询保持SqlConnection打开



我正试图在使用SqlConnection变量的块中进行异步查询。

这是我的代码:

using (var conn = GetNewConnection())
{
var query = "DELETE FROM blah blah blah WHERE blah blah;"
conn.Open();
using (var cmd = new NpgsqlCommand(query, conn))
{
cmd.Parameters.AddRange(new[]
{
new NpgsqlParameter("@a", A),
new NpgsqlParameter("@b", B)
});
cmd.ExecuteNonQueryAsync();
}
}

如上所述,using块的最后一行是一个异步任务。在这种情况下,在异步查询完成之前,连接会一直打开吗?为什么?

应该做些什么来确保异步任务的完成?什么是更好的方法?

利用异步API,将整个代码块封装在异步函数中,并等待其中的任何异步函数调用。

例如

public async Task ExecuteMyNonQueryAsync() {    
using (var conn = GetNewConnection()) {
var query = "DELETE FROM blah blah blah WHERE blah blah;"
await conn.OpenAsync();
using (var cmd = new NpgsqlCommand(query, conn)) {
cmd.Parameters.AddRange(new[] {
new NpgsqlParameter("@a", A),
new NpgsqlParameter("@b", B)
});
await cmd.ExecuteNonQueryAsync();
}
}
}

整个函数可以使用Task.Run在单独的线程上运行

Task.Run(() => ExecuteMyNonQueryAsync());

或在异步事件处理程序中

public async void onSomeEvent(object sender, EventArgs args) {
await ExecuteMyNonQueryAsync();
}

参考Async/Await-异步编程的最佳实践

最新更新