c# - 当不涉及真正的 I/O 调用时,异步链的所有级别是否都需要ConfigureAwait(false)?

标签 c# azure async-await configureawait

在 Azure Document Db Client SDK 之上实现可重用适配器类型的库。

该库可以在任何地方运行,不仅可以在 ASP.NET Core Web 服务中运行,还可以在命令行应用程序、ASP.NET Web Api 等中运行。

在此库中,所有方法都是异步的,它们只是抽象层,可以更轻松地使用 Document Db 客户端 api。唯一真正的异步调用(I/O 请求)实际上是由 Document Db SDK 中的 api 在最低层完成的。我上面写的任何代码都只是在内存中进行数据转换、转换,不涉及实际的 I/O 调用,但它们也是异步的,因为最底层的 Document Db api 是异步的。

我是否仍然需要在堆栈中的所有上层代码上使用 ConfigureAwait(false) ,还是只需要调用 ConfigureAwait(False) 就足够了我自己的代码的最低层调用 Document Db SDK 的方法来进行真正的 I/O 调用?

最佳答案

与在 await 调用之前的同步代码不同,延续是在不同的调用堆栈调用的上下文中执行的。特别是,它们被安排作为单独的委托(delegate)执行,并且它们之间没有调用堆栈关系。因此,为最后一个延续执行指定 ConfigureAwait(false) 仅对该特定延续生效,其他延续仍将使用其各自的调度配置执行。也就是说,如果您的目标是确保不通过库中的任何延续捕获同步上下文(为了防止潜在的死锁或任何其他原因),那么您应该配置所有具有延续的 await 调用与ConfigureAwait(false)

关于c# - 当不涉及真正的 I/O 调用时,异步链的所有级别是否都需要ConfigureAwait(false)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57054770/

相关文章:

c# - 使用将 net461 设置为唯一框架的 ASP.NET Core Web 应用程序 (.NET Core) 与使用 (.NET Framework) 模板之间的区别

c# - Bot Framework 遥测生成的事件未出现在 Application Insights 中

javascript - 声明为异步的方法的正确语法是什么?

javascript - 使用 window.location.reload 进行递归异步等待回调

python - python 如何绕过我之前的代码而先运行后面的代码?

C# 和 SQL 服务器 : inserting/update only truly executes when debugging

c# - 单例不应该总是被销毁吗?

c# - 如果 pendrive 插入 USB 端口,如何使用 c# 检测?

Azure 托管应用程序

api - Power BI REST 身份验证和权限