首先,我已经看到了以下问题: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
,对吧?
答案 0 :(得分:1)
HttpContext.Current
是null
,而不是Controller.HttpContext
。
await
不会更改任何本地变量或成员变量的值。
请注意,仅仅因为您可以访问它并不意味着您应该。 HttpContext
不是线程安全的。