c# - 如何保持 SqlConnection 在 using 块中打开,以便在块内进行异步查询?
问题描述
我正在尝试在带有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();
}
推荐阅读
- javascript - 如何根据共同值对数组进行分组?
- html - 想在我的 html 网页中嵌入 pdf。它在笔记本电脑的浏览器中完美显示,但在移动浏览器中它正在下载而不是打开
- python - 使用python覆盖谷歌表中的数据
- ios - 我无法为容器视图添加适当的约束以适应任何设备
- docker - 为什么 docker 服务在 Ubuntu 的 Windows 子系统上启动后立即关闭?
- docker - 以分离模式启动时如何检查 docker-compose 日志?
- hyperledger-fabric - 可以在超级账本作曲家和 Android 应用程序之间连接吗?
- c++ - 带有结构和继承的初始化列表
- v8 - 我可以使用 V8 的检查器协议来调试从快照加载的 js 代码吗?
- json - 使用 Gson 将 Json 文件转换为地图