如何在块内的异步查询的使用块中保持 SqlConnection 打开?
How to keep SqlConnection open in an using block for an asynchronous query within the block?
我正在尝试在带有 SqlConnection
变量的 using 块中进行异步查询。
这是我的代码:
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();
}
我正在尝试在带有 SqlConnection
变量的 using 块中进行异步查询。
这是我的代码:
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();
}