gpt4 book ai didi

c# - ConfigureAwait(false) 与 ADO.Net SQLConnection 对象

转载 作者:太空狗 更新时间:2023-10-29 23:20:32 24 4
gpt4 key购买 nike

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

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

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

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

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

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

谢谢

最佳答案

作为一般规则,只要异步操作区域自包含且独立,您就可以使用ConfigureAwait(false) - 确实如此对于减少开销和瓶颈可能很重要。库代码通常不需要了解调用上下文。但是,消费代码(例如 winforms、MVC 等)通常需要返回到适当的上下文,因此不应使用配置等待(假)。例如:

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 示例涉及数据相关代码的示例 可能例如需要了解调用上下文。但撇开细微差别不谈:只要使用 的代码记住不要忽略调用上下文,您通常会回到正确的位置。抱歉,这有点含糊不清,但是:遗憾的是,调用上下文的情况通常是这样。

关于c# - ConfigureAwait(false) 与 ADO.Net SQLConnection 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42976695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com