【发布时间】:2020-01-08 16:12:45
【问题描述】:
我有一个 ASP.NET WebForms 应用程序,它的页面使用Async=True,我在我的OnLoad 方法中使用RegisterAsyncTask(new PageAsyncTask(InitialiseAsync)); 异步调用业务逻辑。
现在我知道 ASP.NET WebForms 需要在异步调用之后加上 ConfigureAwait(true),因为它需要返回到原始同步上下文才能完成页面。然而,异步调用链进入库程序集(也是我们构建的)。库不需要知道,也不需要关心同步上下文来完成它的异步工作。此外,它可以(可能)用于其他环境,例如控制台应用程序。
因此:
- 库方法是否应该始终使用
ConfigureAwait(true)(以防它被上下文敏感的应用程序(例如 ASP.NET Web 窗体)使用)?或 - 库方法可以使用
ConfigureAwait(false),WebForms 应用可以使用ConfigureAwait(true)吗?或 - (我确定这不是答案,但是...)我是否应该将布尔值传递给库,说明是使用
ConfigureAwait(true)还是ConfigureAwait(false)?
到目前为止,我一直在使用选项 1,但我现在怀疑我应该使用选项 2,以便库代码可以 await 回到 any 线程并且应用程序将当调用堆栈返回时,最终上下文切换回必需上下文线程。
是这样吗?谢谢
【问题讨论】:
-
注意
ConfigureAwait(true)是默认的——不需要指定 -
谢谢@canton7。我知道这一点,但建议明确表示,并且还可以摆脱代码镜头警告..
-
@ChrisWalsh 恰恰相反。建议在库中使用
ConfigureAwait(false),从而让消费者决定是否要返回到原始同步上下文。 -
既然你在谈论一个库,我不希望这些方法在前端调用任何东西或在主线程上完成需要的东西。所以他们应该使用
ConfigureAwait(false)。当您在前端或 asp 中使用这些方法时,您用true等待它们,一切都很好。 -
devblogs.microsoft.com/dotnet/configureawait-faq 很棒的博文,段落“我什么时候应该使用 ConfigureAwait(false)?”应该有助于回答这个问题
标签: c# asp.net configureawait