ConfigureAwait(false) 与 ADO.Net SQLConnection 对象

ConfigureAwait(false) with ADO.Net SQLConnection object

我已经开始对所有异步 sql 对象使用 ConfigureAwait(false)

connection.OpenAsync().ConfigureAwait(false);
cmd.ExecuteNonQueryAsync().ConfigureAwait(false);

但我担心的是,这种方法会有任何影响吗?

因为这将 运行 在一个线程池上,线程池是一个单独的线程,它是从中发起的,我不确定如果我们不 运行 它在单个线程上的后果。

我们的应用程序是 wcf 服务,它将并行处理 1000 条记录。

如果有人帮助确定可能存在问题的业务场景,那将很有帮助。

谢谢

作为一般规则,只要异步操作的区域自包含且独立,您应该可以使用ConfigureAwait(false) - 事实上这样做可以对于减少开销和瓶颈很重要。库代码 通常不需要知道 调用上下文。然而,消费代码(如winforms、MVC等)通常需要返回到适当的上下文,所以应该不 使用ConfigureAwait(false)。例如:

async Task SomeUXCodeAsync() {
    var data = await GetSomeDataAsync(); // note no ConfigureAwait(false)
    // not shown: use "data"
}
async Task<Foo> GetSomeDataAsync() {
    using(var conn = CreateConnection()) {
        await conn.OpenAsync().ConfigureAwait(false);
        ...
        int result = await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
        ...
        return ...
    }
}

上面的场景非常典型和常见,但是它比那更复杂——评论中的TransactionScope示例涉及数据相关代码的示例例如,可能 需要了解调用上下文。但除了细微差别:只要 consuming 代码记住不要忽略调用上下文,您通常会回到正确的位置。抱歉,这有点含糊不清,但是:遗憾的是,对于调用上下文来说,通常就是这种情况。