Ho il seguente codice WebAPI di prova, non utilizzo WebAPI in produzione ma l'ho fatto a causa di una discussione che ho avuto su questa domanda: WebAPI Async question
Ad ogni modo, ecco il metodo WebAPI incriminato:
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";
}
Finora avevo creduto che la seconda eccezione fosse prevista perché quando il awaitcompletamento sarà probabilmente su un thread diverso dove HttpContext.Currentcome variabile thread-static non si risolverà più al valore appropriato. Ora, in base al contesto di sincronizzazione, potrebbe effettivamente essere costretto a tornare allo stesso thread dopo l'attesa, ma non sto facendo nulla di stravagante nel mio test. Questo è solo un uso semplice e ingenuo di await.
Nei commenti in un'altra domanda mi è stato detto che HttpContext.Currentdovrebbe risolversi dopo un'attesa. C'è anche un altro commento su questa domanda che indica lo stesso. Allora cosa è vero? Dovrebbe risolversi? Penso di no, ma voglio una risposta autorevole su questo perché asynced awaitè abbastanza nuovo da non riuscire a trovare nulla di definitivo.
TL; DR: è HttpContext.Currentpotenzialmente nulldopo un await?


