Setelah berurusan dengan pola async / await C # untuk sementara waktu sekarang, saya tiba-tiba menyadari bahwa saya tidak benar-benar tahu bagaimana menjelaskan apa yang terjadi dalam kode berikut:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
diasumsikan mengembalikan yang ditunggu-tunggu Task
yang mungkin atau mungkin tidak menyebabkan ulir ketika kelanjutan dijalankan.
Saya tidak akan bingung jika penantian tidak berada di dalam satu lingkaran. Saya secara alami berharap bahwa sisa metode (yaitu kelanjutan) berpotensi mengeksekusi di utas lain, yang baik-baik saja.
Namun, di dalam satu lingkaran, konsep "sisa metode" menjadi agak berkabut bagi saya.
Apa yang terjadi pada "sisa loop" jika utas diaktifkan kelanjutan vs jika tidak diaktifkan? Di thread mana iterasi loop berikutnya dieksekusi?
Pengamatan saya menunjukkan (tidak diverifikasi secara meyakinkan) bahwa setiap iterasi dimulai pada utas yang sama (yang asli) sementara kelanjutan dijalankan pada yang lain. Bisakah ini benar-benar terjadi? Jika ya, apakah ini suatu tingkat paralelisme tak terduga yang perlu dipertanggungjawabkan terkait keamanan benang metode GetWorkAsync?
UPDATE: Pertanyaan saya bukan duplikat, seperti yang disarankan oleh beberapa orang. The while (!_quit) { ... }
Pola Kode hanyalah penyederhanaan kode saya yang sebenarnya. Pada kenyataannya, utas saya adalah loop yang berumur panjang yang memproses antrian input item pekerjaan secara berkala (setiap 5 detik secara default). Pemeriksaan kondisi berhenti aktual juga bukan pemeriksaan lapangan sederhana seperti yang disarankan oleh kode sampel, melainkan pemeriksaan pegangan acara.