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
asynckunci mengubah metode menjadi metode async, yang memungkinkan Anda untuk menggunakan awaitkata kunci dalam tubuhnya.
- Ketika
awaitkata kunci diterapkan, itu menangguhkan metode panggilan dan menghasilkan kontrol kembali ke pemanggilnya sampai tugas yang ditunggu selesai.
awaithanya dapat digunakan di dalam suatu asyncmetode.
Apakah konteks yang ditemui awaitdiblokir?
- 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 awaittugas 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, awaithasil eksekusi ke konteks luar, dari mana konteks saat ini dipanggil. Namun, jika konteks luar itu sendiri sedang menunggu arus, maka itu seperti urutan berurutan awaitdalam konteks yang sama.
Jadi, untuk menuai asyncmanfaatnya, seseorang perlu merancang aplikasi untuk menjalankan beberapa konteks paralel (UI, data-klien dll), kemudian awaitdalam satu konteks menghasilkan eksekusi ke konteks lain, sehingga seluruh aplikasi tidak akan menghalangi individu await.