C# 在库中配置等待(true)

C# 在库中配置等待(true),c#,asp.net,configureawait,C#,Asp.net,Configureawait,我有一个ASP.NET WebForms应用程序,它的页面使用Async=True,我正在使用RegisterAsyncTask(new-PageAsyncTask(InitialiseAsync))异步调用业务逻辑 现在我知道ASP.NET WebForms需要在异步调用之后加上ConfigureAwait(true),因为它需要返回到原始同步上下文以完成页面。然而,异步调用链向下进入一个库程序集(也是由我们构建的)。库不需要知道,也不需要关心同步上下文来完成异步工作。此外,它还可以(潜在地)

我有一个ASP.NET WebForms应用程序,它的页面使用
Async=True
,我正在使用
RegisterAsyncTask(new-PageAsyncTask(InitialiseAsync))OnLoad
方法中的code>异步调用业务逻辑

现在我知道ASP.NET WebForms需要在异步调用之后加上
ConfigureAwait(true)
,因为它需要返回到原始同步上下文以完成页面。然而,异步调用链向下进入一个库程序集(也是由我们构建的)。库不需要知道,也不需要关心同步上下文来完成异步工作。此外,它还可以(潜在地)用于其他环境,如控制台应用程序

因此:

  • 库方法是否应始终使用
    ConfigureAwait(true)
    (如果它被上下文敏感的应用程序(如ASP.NET Web窗体)使用)?;或
  • 库方法可以使用
    ConfigureAwait(false)
    吗?WebForms应用程序可以使用
    ConfigureAwait(true)
    ?;或
  • (我肯定这不是答案,但…)我是否应该向库传递一个布尔值,说明是使用
    ConfigureAwait(true)
    还是
    ConfigureAwait(false)
  • 到目前为止,我一直在使用选项1,但我现在怀疑我应该使用选项2,这样库代码就可以
    等待
    返回到任何线程,并且当调用堆栈返回时,应用程序最终将上下文切换回所需的上下文线程


    是这样吗?谢谢

    配置等待
    是一项仅需针对每个功能做出的决定。如果特定函数需要返回其上下文,则不应使用
    ConfigureAwait(false)
    ;否则,它可能会使用它。函数调用方是否需要上下文无关紧要;当调用方等待时,它可以自行决定是否使用
    ConfigureAwait(false)
    。因此,决不能使用选项(3)


    你可以选择选项(2),这就是我现在选择的选项<代码>配置等待(false)
    确实有一些好处。然而,目前在这个问题上的观点正在发生变化,主要是由于ASP.NET核心没有上下文(因此
    ConfigureAwait(false)
    是一个noop,人们不喜欢它把代码弄乱)。就我自己而言,我仍然在库代码中使用
    ConfigureAwait(false)
    ,但其他一些开发人员已经从他们的库中完全删除了
    ConfigureAwait(false)
    。这相当于您的选项(1)。这两种选择中的任何一种都会奏效;如果性能不是一个问题,那就取决于偏好。

    ConfigureAwait
    是一个只需要针对每个函数做出的决定。如果特定函数需要返回其上下文,则不应使用
    ConfigureAwait(false)
    ;否则,它可能会使用它。函数调用方是否需要上下文无关紧要;当调用方等待时,它可以自行决定是否使用
    ConfigureAwait(false)
    。因此,决不能使用选项(3)


    你可以选择选项(2),这就是我现在选择的选项<代码>配置等待(false)确实有一些好处。然而,目前在这个问题上的观点正在发生变化,主要是由于ASP.NET核心没有上下文(因此
    ConfigureAwait(false)
    是一个noop,人们不喜欢它把代码弄乱)。就我自己而言,我仍然在库代码中使用
    ConfigureAwait(false)
    ,但其他一些开发人员已经从他们的库中完全删除了
    ConfigureAwait(false)
    。这相当于您的选项(1)。这两种选择中的任何一种都会奏效;如果性能不是一个问题,那就取决于偏好。

    请注意,
    ConfigureAwait(true)
    是默认值——不需要指定hanks@canton7。我知道这一点,但建议明确,并消除代码镜头警告。@ChrisWalsh相反。建议在库中使用
    ConfigureAwait(false)
    ,从而让使用者决定是否要返回到原始同步上下文。因为您所说的是库,所以我不希望这些方法调用前端的任何内容或需要在主线程上执行的某些操作。因此,他们应该使用
    ConfigureAwait(false)
    。当您在前端或asp中使用这些方法时,您将使用
    true
    等待它们,一切正常。伟大的博客文章,段落“我应该在什么时候使用ConfigureAwait(false)?”应该有助于回答这个问题注意,
    ConfigureAwait(true)
    是默认值——不需要指定Hanks@canton7。我知道这一点,但建议明确,并消除代码镜头警告。@ChrisWalsh相反。建议在库中使用
    ConfigureAwait(false)
    ,从而让使用者决定是否要返回到原始同步上下文。因为您所说的是库,所以我不希望这些方法调用前端的任何内容或需要在主线程上执行的某些操作。因此,他们应该使用
    ConfigureAwait(false)
    。当您在前端或asp中使用这些方法时,您将使用
    true
    等待它们,一切正常。伟大的博客文章,段落“我应该在什么时候使用ConfigureWait(false)”,应该有助于回答这个问题。谢谢你提供了信息丰富的答案。它为已经给出的其他答案增加了额外的分数。非常感谢。感谢您提供的信息丰富的答案。它为已经给出的其他答案增加了额外的分数。非常感谢。