私は次のテストWebAPIコードを持っています。本番環境ではWebAPIを使用していませんが、この質問について話し合ったために作成しました。WebAPI非同期の質問
とにかく、これが問題のある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";
}
私はこれまで、2番目の例外が予想されると信じていawait
ました。これは、完了すると、別のスレッドで発生する可能性が高くHttpContext.Current
、thread-static変数が適切な値に解決されなくなるためです。さて、同期コンテキストに基づいて、待機後に実際には同じスレッドに戻ることを強制される可能性がありますが、テストでは特別なことは何もしていません。これは、の単純で素朴な使用法ですawait
。
別の質問のコメントでHttpContext.Current
、待ってから解決する必要があると言われました。同じことを示すこの質問にはさらに別のコメントがあります。では、何が本当ですか?それは解決する必要がありますか?いいえと思いますが、これについては信頼できる答えが必要です。なぜならasync
、それawait
は十分に新しいので、決定的なものを見つけることができないからです。
TL; DR:HttpContext.Current
潜在的null
にawait
?