私は次のテスト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?


