Saya memiliki kode WebAPI pengujian berikut, saya tidak menggunakan WebAPI dalam produksi, tetapi saya membuatnya karena diskusi yang saya lakukan tentang pertanyaan ini: Pertanyaan Asinkron WebAPI
Bagaimanapun, inilah metode WebAPI yang melanggar:
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";
}
Saya dengan ini percaya bahwa pengecualian kedua diharapkan karena ketika await
selesai, kemungkinan akan berada di utas yang berbeda dimana HttpContext.Current
variabel utas-statis tidak akan lagi menyelesaikan ke nilai yang sesuai. Sekarang, berdasarkan konteks sinkronisasi, itu sebenarnya bisa dipaksa untuk kembali ke utas yang sama setelah menunggu tetapi saya tidak melakukan sesuatu yang mewah dalam pengujian saya. Ini hanyalah penggunaan yang polos dan naif await
.
Dalam komentar di pertanyaan lain, saya diberi tahu yang HttpContext.Current
harus diselesaikan setelah menunggu. Bahkan ada komentar lain atas pertanyaan ini yang menunjukkan hal yang sama. Jadi apa yang benar? Haruskah itu diselesaikan? Saya pikir tidak, tetapi saya ingin jawaban yang berwibawa tentang ini karena async
dan await
cukup baru sehingga saya tidak dapat menemukan sesuatu yang pasti.
TL; DR: Apakah HttpContext.Current
berpotensi null
setelah await
?