我有以下的测试 WebAPI 代码,我没有在生产环境中使用 WebAPI,但是我之所以这样做是因为我讨论了这个问题: WebAPI 异步问题
无论如何,这里有一个冒犯性的 WebAPI 方法:
public async Task<string> Get(int id)
{
var x = HttpContext.Current;
if (x == null)
{
// not thrown
throw new ArgumentException("HttpContext.Current is null");
}
await Task.Run(() => { Task.Delay(500); id = 3; });
x = HttpContext.Current;
if (x == null)
{
// thrown
throw new ArgumentException("HttpContext.Current is null");
}
return "value";
}
在此之前,我认为第二个异常是可以预料的,因为当 await
完成时,它可能位于另一个线程上,其中作为线程静态变量的 HttpContext.Current
将不再解析为适当的值。现在,基于同步上下文,它实际上可以被迫在等待之后返回到同一个线程,但是在我的测试中我没有做任何花哨的事情。这只是 await
的一个简单、天真的用法。
在另一个问题的评论中,我被告知 HttpContext.Current
应该在等待之后解决。对于这个问题,甚至还有另外一个评论指出了同样的问题。那么什么是真的?应该解决吗?我认为没有,但我想要一个权威的答案,因为 async
和 await
是新的,我不能找到任何权威的东西。
在 await
之后 HttpContext.Current
是否可能是 null
?