如何在使用块中保持SqlConnection打开,以便在该块中进行异步查询?

时间:2018-11-30 17:46:13

标签: c# sql .net asynchronous sqlconnection

我正在尝试在带有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块的最后一行是异步任务。在这种情况下,将在异步查询完成之前打开连接吗?为什么或为什么不呢?

应该采取什么措施来确保异步任务的完成?有什么更好的方法?

1 个答案:

答案 0 :(得分:5)

利用异步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 - Best Practices in Asynchronous Programming