У мене є такий тестовий код WebAPI, я не використовую WebAPI у виробництві, але я зробив це через обговорення цього питання: WebAPI Async question
У будь-якому випадку, ось образливий метод 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
?