Tersandung pada posting ini yang berbicara tentang membuat permintaan web async.
Selain kesederhanaan, jika di dunia nyata, yang Anda lakukan hanyalah membuat permintaan async dan menunggu di baris berikutnya, bukankah itu sama dengan membuat panggilan sinkronisasi di tempat pertama?
Jawaban:
Tidak,
async + await != sync
karena kelanjutanDari MSDN 'Pemrograman Asinkron dengan Async dan Menunggu (C # dan Visual Basic)'
Misalnya eksekusi async tidak akan memblokir utas UI, dan
Some TextBox.Text
akan diperbarui setelah unduhan selesaisumber
Console.WriteLine(await GetStringOverNetwork());
? Bagaimana jika Anda memerlukan output dari doa asinkron? Apakah program akan memblokir akses pertama, bahkan jika utas berpotensi melanjutkan eksekusi?Tidak, itu tidak sama.
async
Blok kode Anda sedang menungguawait
panggilan kembali untuk melanjutkan, namun aplikasi Anda yang lain tidak menunggu dan masih dapat berlanjut seperti biasa.Sebaliknya, panggilan sinkron akan membuat seluruh aplikasi atau utas Anda menunggu hingga kode selesai dijalankan untuk melanjutkan dengan hal lain.
sumber
Ijinkan saya untuk mengklarifikasi hal-hal yang berkaitan dengan async / menunggu.
Ketika menunggu ditemui mesin negara yang mendasari memungkinkan kontrol untuk segera dikembalikan. Kemudian, ketika panggilan yang ditunggu selesai, mesin negara yang mendasari memungkinkan eksekusi untuk melanjutkan di garis setelah panggilan yang ditunggu.
Oleh karena itu, blok async tidak diblokir juga tidak menunggu panggilan yang ditunggu selesai; Kontrol dikembalikan segera ketika perintah tunggu ditemui.
Mesin negara yang mendasarinya adalah bagian dari "sihir" di balik penggunaan async / menunggu yang tidak digunakan dan dilewatkan.
sumber
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 :
Apakah konteks yang ditemui
await
diblokir?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 )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
: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 berurutanawait
dalam konteks yang sama.Jadi, untuk menuai
async
manfaatnya, seseorang perlu merancang aplikasi untuk menjalankan beberapa konteks paralel (UI, data-klien dll), kemudianawait
dalam satu konteks menghasilkan eksekusi ke konteks lain, sehingga seluruh aplikasi tidak akan menghalangi individuawait
.sumber