Mam następujący testowy kod WebAPI, nie używam WebAPI w środowisku produkcyjnym, ale zrobiłem to z powodu dyskusji, którą miałem na to pytanie: Pytanie Async WebAPI
Tak czy inaczej, oto obraźliwa metoda 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";
}
Uważałem, że drugi wyjątek jest oczekiwany, ponieważ po await
zakończeniu prawdopodobnie będzie w innym wątku, gdzie HttpContext.Current
zmienna statyczna wątku nie będzie już rozwiązywać się do odpowiedniej wartości. Teraz, w oparciu o kontekst synchronizacji, może być faktycznie zmuszony do powrotu do tego samego wątku po oczekiwaniu, ale nie robię nic nadzwyczajnego w moim teście. To tylko zwykłe, naiwne użycie await
.
W komentarzach do innego pytania powiedziano mi, że HttpContext.Current
powinno to ustąpić po odczekaniu. Jest nawet inny komentarz do tego pytania, który wskazuje na to samo. Więc co jest prawdą? Czy powinno rozwiązać? I nie myślę, ale chcę autorytatywną odpowiedź na to, bo async
i await
jest na tyle nowy, że nie mogę znaleźć nic ostateczne.
TL; DR: Czy HttpContext.Current
potencjalnie jest null
po await
?