Metode tindakan asinkron berguna ketika suatu tindakan harus melakukan beberapa operasi jangka panjang yang independen.
Penggunaan khas untuk kelas AsyncController adalah panggilan layanan Web yang sudah berjalan lama.
Haruskah panggilan basis data saya tidak sinkron?
Kumpulan utas IIS sering dapat menangani banyak permintaan pemblokiran yang lebih simultan daripada server basis data. Jika basis data adalah hambatan, panggilan asinkron tidak akan mempercepat respons basis data. Tanpa mekanisme pelambatan, secara efisien mengirimkan lebih banyak pekerjaan ke server database yang kewalahan dengan menggunakan panggilan asinkron hanya memindahkan lebih banyak beban ke database. Jika DB Anda adalah penghambat, panggilan asinkron tidak akan menjadi peluru ajaib.
Anda harus melihat referensi 1 dan 2
Berasal dari @PanagiotisKanavos komentar:
Selain itu, async tidak berarti paralel. Eksekusi asinkron membebaskan threadpool thread berharga dari pemblokiran untuk sumber daya eksternal, tanpa biaya kerumitan atau kinerja. Ini berarti mesin IIS yang sama dapat menangani lebih banyak permintaan bersamaan, bukan karena itu akan berjalan lebih cepat.
Anda juga harus mempertimbangkan bahwa pemblokiran panggilan dimulai dengan spin-intensif CPU. Selama masa-masa stres, pemblokiran panggilan akan menyebabkan penundaan yang meningkat dan daur ulang kumpulan aplikasi. Panggilan asinkron hanya menghindari ini
Anda mungkin menemukan artikel MSDN saya pada subjek bermanfaat ; Saya mengambil banyak ruang dalam artikel yang menjelaskan kapan Anda harus menggunakan
async
ASP.NET, bukan hanya bagaimana menggunakannyaasync
di ASP.NET.Pertama, memahami bahwa
async
/await
adalah semua tentang membebaskan benang . Pada aplikasi GUI, ini terutama tentang membebaskan utas GUI sehingga pengalaman pengguna lebih baik. Pada aplikasi server (termasuk ASP.NET MVC), ini terutama tentang membebaskan utas permintaan sehingga server dapat menskala.Secara khusus, itu tidak akan:
await
.await
hanya "hasil" ke kumpulan thread ASP.NET, bukan ke browser.Saya akan mengatakan itu baik untuk menggunakannya di mana pun Anda melakukan I / O. Ini mungkin belum tentu bermanfaat (lihat di bawah).
Namun, buruk untuk menggunakannya untuk metode yang terikat CPU. Terkadang para pengembang berpikir mereka bisa mendapatkan manfaat
async
dengan hanya memanggilTask.Run
pengendali mereka, dan ini adalah ide yang mengerikan. Karena kode itu akhirnya membebaskan utas permintaan dengan mengambil utas lainnya, jadi tidak ada untungnya sama sekali (dan pada kenyataannya, mereka menerima penalti dari sakelar utas ekstra)!Anda dapat menggunakan metode apa pun yang Anda tunggu tersedia. Saat ini sebagian besar pemain utama mendukung
async
, tetapi ada beberapa yang tidak. Jika ORM Anda tidak mendukungasync
, maka jangan mencoba untuk membungkusnyaTask.Run
atau semacamnya (lihat di atas).Perhatikan bahwa saya berkata "Anda bisa menggunakan". Jika Anda berbicara tentang ASP.NET MVC dengan backend database tunggal, maka Anda (hampir pasti) tidak akan mendapatkan manfaat skalabilitas dari
async
. Ini karena IIS dapat menangani permintaan yang jauh lebih konkuren daripada satu contoh SQL server (atau RDBMS klasik lainnya). Namun, jika backend Anda lebih modern - cluster SQL server, Azure SQL, NoSQL, dll - dan backend Anda bisa menskalakan, dan bottleneck skalabilitas Anda adalah IIS, maka Anda bisa mendapatkan manfaat skalabilitas dariasync
.Sebanyak yang Anda suka. Namun, perhatikan bahwa banyak ORM memiliki aturan satu operasi per koneksi. Secara khusus, EF hanya mengizinkan satu operasi per DbContext; ini benar apakah operasi itu sinkron atau asinkron.
Juga, ingatlah skalabilitas backend Anda lagi. Jika Anda menekan satu contoh SQL Server, dan IIS Anda sudah mampu menjaga SQLServer pada kapasitas penuh, maka menggandakan atau tiga kali lipat tekanan pada SQLServer tidak akan membantu Anda sama sekali.
sumber
Seperti biasa dalam pemrograman, itu tergantung . Selalu ada trade-off ketika menuruni jalan tertentu.
async-await
bersinar di tempat-tempat di mana Anda tahu Anda akan menerima permintaan bersamaan untuk layanan Anda dan Anda ingin dapat mengukur dengan baik. Bagaimana caraasync-await
membantu meningkatkan skala? Pada kenyataan bahwa ketika Anda memanggil panggilan Iyn async secara serempak , seperti panggilan jaringan atau memukul basis data Anda, utas saat ini yang bertanggung jawab atas eksekusi diblokir menunggu permintaan untuk selesai. Ketika Anda menggunakanasync-await
, Anda mengaktifkan kerangka kerja untuk membuat mesin keadaan untuk Anda yang memastikan bahwa setelah panggilan IO selesai, metode Anda terus mengeksekusi dari tempat itu ditinggalkan.Satu hal yang perlu diperhatikan adalah mesin state ini memiliki overhead yang halus. Membuat metode asinkron tidak membuatnya mengeksekusi lebih cepat , dan itu merupakan faktor penting untuk dipahami dan kesalahpahaman yang dimiliki banyak orang.
Hal lain yang perlu dipertimbangkan ketika menggunakan
async-await
adalah fakta bahwa async sepenuhnya , artinya Anda akan melihat async menembus seluruh tumpukan panggilan Anda, paling atas di buttom. Ini berarti bahwa jika Anda ingin mengekspos API sinkron, Anda akan sering mendapati diri Anda menduplikasi sejumlah kode tertentu, karena async dan sinkronisasi tidak tercampur dengan baik.Jika Anda memilih untuk menggunakan jalur panggilan Iync async, maka ya,
async-await
akan menjadi pilihan yang baik, karena semakin banyak penyedia basis data modern mengekspos metode async menerapkan TAP (Pola Tugas Asinkron).Sebanyak yang Anda inginkan, selama Anda mengikuti aturan yang dinyatakan oleh penyedia basis data Anda. Tidak ada batasan jumlah panggilan async yang dapat Anda lakukan. Jika Anda memiliki kueri yang independen satu sama lain dan dapat dibuat secara bersamaan, Anda dapat memutar tugas baru untuk masing-masing dan menggunakan
await Task.WhenAll
untuk menunggu keduanya selesai.sumber
scale out well
artinyayour server won't die under load
. Atau mungkin kasusonce burned ...
5 sen saya:
async/await
jika dan hanya jika Anda melakukan operasi IO, seperti DB atau layanan web layanan eksternal.PS Ada kasus luar biasa untuk poin 1, tetapi Anda harus memiliki pemahaman yang baik tentang async internal untuk ini.
Sebagai keuntungan tambahan, Anda dapat melakukan beberapa panggilan IO secara paralel jika diperlukan:
sumber
async
tindakan sangat membantu ketika tindakan melakukan beberapa operasi I \ O ke DB atau beberapa panggilan yang terikat jaringan di mana utas yang memproses permintaan akan terhenti sebelum mendapat jawaban dari DB atau panggilan yang terikat jaringan yang baru saja Anda panggil. Sebaiknya Anda menggunakan menunggu dengan mereka dan itu benar-benar akan meningkatkan respon aplikasi Anda (karena lebih sedikit thread input ASP \ output akan terhenti sambil menunggu DB atau operasi lain seperti itu). Dalam semua aplikasi saya setiap kali banyak panggilan ke DB sangat diperlukan saya selalu membungkusnya dengan metode awaiatable dan menyebutnya denganawait
kata kunci.sumber
Seperti yang Anda ketahui, MVC mendukung pengontrol asinkron dan Anda harus memanfaatkannya. Jika Controller Anda, melakukan operasi yang panjang, (mungkin berbasis disk I / o atau panggilan jaringan ke layanan jarak jauh lain), jika permintaan ditangani secara sinkron, utas IIS sibuk sepanjang waktu. Akibatnya, utas hanya menunggu operasi yang panjang selesai. Ini dapat digunakan dengan lebih baik dengan melayani permintaan lain sementara operasi yang diminta terlebih dahulu sedang dalam proses. Ini akan membantu dalam melayani lebih banyak permintaan bersamaan. Layanan web Anda akan sangat skalabel dan tidak akan dengan mudah mengalami masalah C10k . Sebaiknya gunakan async / tunggu untuk permintaan db. dan ya Anda dapat menggunakannya sebanyak yang Anda anggap cocok.
Lihatlah di sini untuk saran yang sangat baik.
sumber
Pengalaman saya adalah bahwa hari ini banyak pengembang menggunakan
async/await
sebagai default untuk pengendali.Saran saya adalah, gunakan hanya ketika Anda tahu itu akan membantu Anda .
Alasannya, seperti yang telah disebutkan oleh Stephen Cleary dan yang lain, itu dapat memperkenalkan masalah kinerja, bukan menyelesaikannya, dan itu akan membantu Anda hanya dalam skenario tertentu:
sumber
Adalah baik untuk melakukannya di mana pun Anda dapat menggunakan metode async terutama ketika Anda memiliki masalah kinerja di tingkat proses pekerja yang terjadi untuk data besar dan operasi perhitungan. Kalau tidak, tidak perlu karena unit testing akan perlu casting.
Ya, lebih baik menggunakan async untuk setiap operasi DB sebisa mungkin untuk menghindari masalah kinerja di tingkat proses pekerja. Perhatikan bahwa EF telah menciptakan banyak alternatif async untuk sebagian besar operasi, seperti:
Langit adalah batasnya
sumber