У меня есть следующий тестовый код 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это достаточно новый , что я не могу найти ничего окончательного.
TL; DR: HttpContext.Currentпотенциально nullпосле await?


