我有以下测试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。
await
HttpContext.Current
在另一个问题的评论中,我被告知HttpContext.Current应该在等待后解决。关于这个问题,甚至还有另一条评论表明了这一点。那是真的吗?它应该解决吗?我认为没有,但是我想要一个权威的答案,因为async和await足够新,所以我找不到任何确定的答案。
async
TL; DR:HttpContext.Current可能null在await?
null
请确保您正在编写ASP.NET 4.5 应用程序并以4.5为目标。async并且await有除非你是在4.5上运行ASP.NET未定义行为 ,并 使用新的“任务型”同步上下文。
特别是,这意味着您必须:
httpRuntime.targetFramework
4.5
appSettings
aspnet:UseTaskFriendlySynchronizationContext
true
可在此处获得更多信息。