我已开始将ConfigureAwait(false)
与所有异步sql对象一起使用。
connection.OpenAsync().ConfigureAwait(false);
cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
但我担心的是,这种方法会有什么影响吗?
由于这将在一个线程池上运行,该线程池是一个独立的线程,因此我不确定如果我们不在单个线程上运行它会产生什么后果。
我们的应用程序是wcf服务,它将并行处理1000个记录。
如果有人帮助识别可能有用的问题的业务场景。
由于
答案 0 :(得分:4)
作为一般规则,只要异步操作的区域自包含且独立,您应该可以使用ConfigureAwait(false)
- 并且确实这样做对于减少开销很重要和瓶颈。库代码通常不需要知道调用上下文。但是,使用代码(例如winforms,MVC等)通常需要返回适当的上下文,因此不应使用{{ 1}}。例如:
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 ...
}
}
示例涉及数据相关代码可能<的示例例如,/ em>需要知道调用上下文。但细微差别:只要消费代码记住不要忽略呼叫上下文,你通常会回到正确的位置。对不起,这有点模糊和毛茸茸,但是:遗憾的是,对于呼叫上下文,通常是 。