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 menggunakannya async
di ASP.NET.
Saya memiliki beberapa masalah dalam menggunakan tindakan async di ASP.NET MVC. Ketika itu meningkatkan kinerja aplikasi saya, dan kapan - tidak.
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:
- Buat permintaan pribadi Anda selesai lebih cepat. Bahkan, mereka akan menyelesaikan (hanya sedikit sedikit) lebih lambat.
- Kembali ke pemanggil / browser saat Anda menekan sebuah
await
. await
hanya "hasil" ke kumpulan thread ASP.NET, bukan ke browser.
Pertanyaan pertama adalah - apakah baik menggunakan tindakan async di ASP.NET MVC?
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 memanggil Task.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)!
Haruskah saya menggunakan kata kunci async / menunggu ketika saya ingin query database (melalui EF / NHibernate / ORM lainnya)?
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 mendukung async
, maka jangan mencoba untuk membungkusnya Task.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 dari async
.
Pertanyaan ketiga - Berapa kali saya dapat menggunakan kata kunci menunggu untuk query database secara tidak sinkron dalam SATU metode tindakan tunggal?
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.