gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:23 24 4
gpt4 key购买 nike

在 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/

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