У меня есть следующий тестовый код WebAPI, я не использую WebAPI в производстве, но я сделал это из-за обсуждения, которое у меня было по этому вопросу: Вопрос WebAPI Async
В любом случае, здесь оскорбительный метод 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
?