Eu tenho o seguinte código WebAPI de teste, não uso WebAPI na produção, mas fiz isso devido a uma discussão que tive sobre esta questão: Pergunta WebAPI Async
De qualquer forma, aqui está o método WebAPI ofensivo:
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";
}
Eu acreditava aqui que a segunda exceção é esperada porque, quando o for await
concluído, provavelmente será em um segmento diferente, onde HttpContext.Current
uma variável estática do segmento não resolverá mais para o valor apropriado. Agora, com base no contexto de sincronização, ele poderia realmente ser forçado a voltar para o mesmo encadeamento após o await, mas não estou fazendo nada sofisticado em meu teste. Este é apenas um uso simples e ingênuo de await
.
Em comentários em outra questão foi-me dito que HttpContext.Current
deveria resolver depois de esperar. Há até outro comentário sobre esta questão indicando o mesmo. Então, o que é verdade? Deve resolver? Eu acho que não, mas eu quero uma resposta confiável sobre isso porque async
e await
é novo o suficiente para não conseguir encontrar nada definitivo.
TL; DR: É HttpContext.Current
potencialmente null
após um await
?