使用COnfigureAwait(false)时为什么会有一个填充的HttpContext?

时间:2019-07-02 19:49:04

标签: c# .net asp.net-mvc async-await

首先,我已经看到了以下问题:ConfigureAwait(false) not making HttpContext NULL as expected,但我仍然无法解释正在发生的事情。

这里有两种方法:

public async Task<ActionResult> Contact2()
{
    var h = new HttpClient();
    var sc = SynchronizationContext.Current;
    HttpContext.Session["x"] = "d";

    var s = await h.GetStringAsync("http://www.google.com").ConfigureAwait(false);

    var contextIsNull = HttpContext == null;
    return View();
}

public async Task<ActionResult> Contact()
{
    var h = new HttpClient();
    var sc = SynchronizationContext.Current;
    HttpContext.Session["x"] = "d";

    await Task.Delay(2000).ConfigureAwait(false);

    var contextIsNull = HttpContext == null;

    return View();
}

执行两个命令时,SynchronizationContext.Current为预期的空值,但是HttpContext不为空,并且在两种情况下我都可以访问Session。为什么是这样? HttpContext为什么不为null?上下文已切换,因为等待后我读了HttpContext,对吧?

1 个答案:

答案 0 :(得分:1)

HttpContext.Currentnull,而不是Controller.HttpContext

await不会更改任何本地变量或成员变量的值。

请注意,仅仅因为您可以访问它并不意味着您应该HttpContext不是线程安全的。