我有以下測試的WebAPI的代碼,我沒有在生產中使用的WebAPI,但我做了,因爲討論中,我對這個問題的:WebAPI Async question爲什麼在等待後HttpContext.Current爲null?
不管怎麼說,這裏是違規的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
是新的,我找不到任何明確的。
TL; DR:是HttpContext.Current
潛在null
之後await
?
你的問題不清楚 - 你說過你會發生什麼,評論表明那*是*發生了什麼......所以你有什麼困惑? –
@ user2674389,這是誤導。它是'AspNetSynchronizationContext',負責'HttpContext',而不是'await'。更多的,'await'的繼續回調可能(也很可能會)發生在Web API執行模型的不同線程上。編輯爲 – Noseratio
以提供簡潔的問題 – welegan