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 awaitzakończeniu prawdopodobnie będzie w innym wątku, gdzie HttpContext.Currentzmienna 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.Currentpowinno 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 asynci awaitjest na tyle nowy, że nie mogę znaleźć nic ostateczne.
TL; DR: Czy HttpContext.Currentpotencjalnie jest nullpo await?


