使用ADO.Net SQLConnection对象ConfigureAwait(false)

时间:2017-03-23 12:55:41

标签: c# sql multithreading async-await configureawait

我已开始将ConfigureAwait(false)与所有异步sql对象一起使用。

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

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

由于这将在一个线程池上运行,该线程池是一个独立的线程,因此我不确定如果我们不在单个线程上运行它会产生什么后果。

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

如果有人帮助识别可能有用的问题的业务场景。

由于

1 个答案:

答案 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>需要知道调用上下文。但细微差别:只要消费代码记住不要忽略呼叫上下文,你通常会回到正确的位置。对不起,这有点模糊和毛茸茸,但是:遗憾的是,对于呼叫上下文,通常是