Saya tersandung pada ini dengan pertanyaan yang sama dalam pikiran, namun setelah membaca tanggapan pertanyaan itu tampaknya berlama-lama, bingung dengan referensi untuk "sihir di bawah tenda".
Dari Pemrograman Asinkron yang disebutkan di atas :
- Kata
async
kunci mengubah metode menjadi metode async, yang memungkinkan Anda untuk menggunakan await
kata kunci dalam tubuhnya.
- Ketika
await
kata kunci diterapkan, itu menangguhkan metode panggilan dan menghasilkan kontrol kembali ke pemanggilnya sampai tugas yang ditunggu selesai.
await
hanya dapat digunakan di dalam suatu async
metode.
Apakah konteks yang ditemui await
diblokir?
- Ya . Pada dasarnya itu adalah penghalang sinkronisasi lokal untuk mempertahankan status yang diketahui dalam konteks eksekusi; kecuali bahwa konteks lain, jika ada, tidak bergabung.
Apakah sisa blok aplikasi di await
?
Itu tergantung pada bagaimana aplikasi Anda ditulis. Jika itu adalah serangkaian await
tugas ed dependen yang diluncurkan secara berurutan dalam konteks yang sama (lihat: Mencoba memahami perilaku asinkron / menunggu )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
dengan cara ini masing await
- masing akan memblokir pemijahan yang berikutnya.
Di sisi lain, tugas dependen yang sama yang diluncurkan secara paralel akan dieksekusi secara paralel dan konteksnya hanya akan memblokir pada resp. await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
Secara umum, await
hasil eksekusi ke konteks luar, dari mana konteks saat ini dipanggil. Namun, jika konteks luar itu sendiri sedang menunggu arus, maka itu seperti urutan berurutan await
dalam konteks yang sama.
Jadi, untuk menuai async
manfaatnya, seseorang perlu merancang aplikasi untuk menjalankan beberapa konteks paralel (UI, data-klien dll), kemudian await
dalam satu konteks menghasilkan eksekusi ke konteks lain, sehingga seluruh aplikasi tidak akan menghalangi individu await
.