Как сохранить SqlConnection открытым в блоке using для асинхронного запроса внутри блока? - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь сделать асинхронный запрос в блоке использования с переменной 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();
    }
}

Как видно выше, последняя строка используемого блока является асинхронной задачей.В этой ситуации будет ли соединение открыто до завершения асинхронного запроса?Почему или почему нет?

Что нужно сделать, чтобы обеспечить выполнение асинхронной задачи?Как лучше это сделать?

1 Ответ

0 голосов
/ 30 ноября 2018

Инкапсулируйте весь блок кода в асинхронную функцию, используя преимущества асинхронного 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();
}

Ссылка Асинхронное / ожидание - Лучшие практики асинхронного программирования

...