C# ConfigureWait(false)-延续是否总是在不同的线程上运行?

C# ConfigureWait(false)-延续是否总是在不同的线程上运行?,c#,asp.net,.net,asp.net-web-api,async-await,C#,Asp.net,.net,Asp.net Web Api,Async Await,这个问题是在的上下文中提出的(不是ASP.NET核心)。我曾试图就这个话题做我自己的研究,但是我找不到明确的答案 ConfigureAwait(…)方法参数的官方声明如下: true尝试将继续封送回捕获的原始上下文;否则,false 进一步解释尝试关键字如下: 这意味着可能没有任何东西可以撤回。。。可能没有要捕获的上下文,例如,SynchronizationContext。当前可能返回null 如果我理解正确,那么ASP.NET WebApi 2就不是这样了,因为存在AspNetSynchron

这个问题是在的上下文中提出的(不是ASP.NET核心)。我曾试图就这个话题做我自己的研究,但是我找不到明确的答案

ConfigureAwait(…)
方法参数的官方声明如下:

true
尝试将继续封送回捕获的原始上下文;否则,
false

进一步解释
尝试
关键字如下:

这意味着可能没有任何东西可以撤回。。。可能没有要捕获的上下文,例如,
SynchronizationContext。当前
可能返回
null

如果我理解正确,那么ASP.NET WebApi 2就不是这样了,因为存在
AspNetSynchronizationContext
对吗

现在让我们看一下以下控制器操作方法:

[HttpGet]
public async Task<String> GetValues()
{
    // First half.

    var values = await HeavyIo().ConfigureAwait(false);

    // Second half.

    return values;
}
[HttpGet]
公共异步任务GetValues()
{
//上半场。
var values=await HeavyIo().ConfigureAwait(false);
//下半场。
返回值;
}

通过传递
continueOnCapturedContext:false
是否可以保证标记为
//后半部分。
的continuation始终在不同的线程上执行?或者,如果异步操作完成时捕获同步上下文的线程将是空闲的,那么继续将在同一线程上运行吗?

当以否定形式询问时,我认为答案是,非常清楚-不能保证后半部分将在与前半部分不同的线程上执行。正如您推测的,当继续执行时,原始线程很可能是幸运的下一个可用线程

还需要注意的是,恢复的是上下文,而不一定是线程。在Windows消息循环的情况下(例如WinForms UI线程),是运行消息循环的UI线程拾取并执行延续,因此使用
ConfigureAwait(true)
,保证相同的线程。但是,对于其他同步上下文,可能没有特别的理由要求甚至更喜欢原始线程,只要它们认为是“上下文”的内容被恢复;e、 g.
HttpContext.Current
[身份,文化]在ASP.NET中

至少从理论上讲,
HeavyIo()
也有同步完成的可能性,在这种情况下,无论如何都没有上下文切换,下半部分将与前半部分在同一线程上继续。我只能从您选择的命名(“重”)中假设,您暗示这将不是一个选项