Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在using块中为块内的异步查询保持SqlConnection打开?_C#_Sql_.net_Asynchronous_Sqlconnection - Fatal编程技术网

C# 如何在using块中为块内的异步查询保持SqlConnection打开?

C# 如何在using块中为块内的异步查询保持SqlConnection打开?,c#,sql,.net,asynchronous,sqlconnection,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.Ad

我正在尝试使用
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();
}

参考

将整个代码块封装在异步函数中,利用异步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();
}

参考

使包含using块的方法
异步
并使用
等待
谢谢。我有一个后续问题。这样做,我的程序会停止执行吗?因为这是一个db操作,我希望我的程序能够继续运行,而不是等待db操作——这将花费很多时间,因为我有100k+记录。如果没有任何东西依赖于该操作,则在另一个线程上等待整个函数。封装此代码的函数在何处/如何运行?我通常将代码放入后台工作并运行后台工作程序异步的。使用ExecuteOnQuery而不是ExecuteOnQueryAsync。使包含using块的方法
异步
,并使用
等待
谢谢。我有一个后续问题。这样做,我的程序会停止执行吗?因为这是一个db操作,我希望我的程序能够继续运行,而不是等待db操作——这将花费很多时间,因为我有100k+记录。如果没有任何东西依赖于该操作,则在另一个线程上等待整个函数。封装此代码的函数在何处/如何运行?我通常将代码放入后台工作并运行后台工作程序异步的。使用ExecuteOnQuery而不是ExecuteOnQueryAsync。这应该可以做到。谢谢@NkoshiA的后续问题。是否要求该方法为异步方法才能在新线程中运行?在新线程中运行方法以使该方法异步运行还不够吗?应该这样做。谢谢@NkoshiA的后续问题。是否要求该方法为异步方法才能在新线程中运行?在新线程中运行方法以使该方法异步运行是否还不够?