Memutuskan Kapan Waktu yang Tepat untuk Menerapkan Pola Asinkron Berbasis Kejadian
Pola Asinkron berbasis Peristiwa menyediakan pola untuk mengekspos perilaku asinkron suatu kelas. Dengan pengenalan pola ini, .NET menentukan dua pola untuk mengekspos perilaku asinkron: Pola Asinkron berdasarkan System.IAsyncResult antarmuka, dan pola berbasis peristiwa. Artikel ini menjelaskan kapan tepat bagi Anda untuk menerapkan kedua pola tersebut.
Untuk informasi selengkapnya tentang pemrograman asinkron dengan IAsyncResult antarmuka, lihat Model Pemrograman Asinkron (APM).
Prinsip Umum
Secara umum, Anda harus mengekspos fitur asinkron menggunakan Pola Asinkron berbasis Peristiwa bila memungkinkan. Namun, ada beberapa persyaratan yang tidak dapat dipenuhi oleh pola berbasis peristiwa. Dalam kasus tersebut IAsyncResult, Anda mungkin perlu menerapkan pola selain pola berbasis peristiwa.
Catatan
Sangat jarang pola diimplementasikan IAsyncResult tanpa pola berbasis peristiwa juga diimplementasikan.
Panduan
Daftar berikut menjelaskan pedoman kapan Anda harus menerapkan Pola Asinkron Berbasis Peristiwa:
Gunakan pola berbasis peristiwa sebagai API default untuk mengekspos perilaku asinkron untuk kelas Anda.
Jangan mengekspos IAsyncResult pola saat kelas Anda terutama digunakan dalam aplikasi klien, misalnya Formulir Windows.
Hanya mengekspos IAsyncResult pola ketika diperlukan untuk memenuhi kebutuhan Anda. Misalnya, kompatibilitas dengan API yang ada mungkin mengharuskan Anda untuk mengekspos IAsyncResult pola.
Jangan mengekspos IAsyncResult pola tanpa juga mengekspos pola berbasis peristiwa.
Jika Anda harus mengekspos IAsyncResult pola, lakukan sebagai opsi lanjutan. Misalnya, jika Anda membuat objek proksi, hasilkan pola berbasis peristiwa secara default, dengan opsi untuk menghasilkan IAsyncResult pola.
Bangun implementasi pola berbasis peristiwa Anda pada implementasi pola Anda IAsyncResult.
Hindari mengekspos pola berbasis peristiwa dan IAsyncResult pola pada kelas yang sama. Mengekspos pola berbasis peristiwa pada kelas "tingkat yang lebih tinggi" dan IAsyncResult pola pada kelas "tingkat bawah". Misalnya, bandingkan pola berbasis peristiwa pada WebClient komponen dengan IAsyncResult pola pada HttpRequest kelas.
Mengekspos pola berbasis peristiwa dan IAsyncResult pola pada kelas yang sama saat kompatibilitas memerlukannya. Misalnya, jika Anda telah merilis IAsyncResult API yang menggunakan pola, Anda harus mempertahankan IAsyncResult pola untuk kompatibilitas mundur.
Mengekspos pola berbasis peristiwa dan IAsyncResult pola pada kelas yang sama jika kompleksitas model objek yang dihasilkan melebihi manfaat memisahkan implementasi. Lebih baik mengekspos kedua pola pada satu kelas daripada menghindari mengekspos pola berbasis peristiwa.
Jika Anda harus mengekspos pola dan IAsyncResult pola berbasis peristiwa pada satu kelas, gunakan EditorBrowsableAttribute atur ke untuk Advanced menandai IAsyncResult implementasi pola sebagai fitur tingkat lanjut. Ini menunjukkan untuk merancang lingkungan, seperti Visual Studio IntelliSense, tidak menampilkan IAsyncResult properti dan metode. Properti dan metode ini masih sepenuhnya dapat digunakan, tetapi pengembang yang bekerja melalui IntelliSense memiliki tampilan API yang lebih jelas.
Kriteria untuk Mengekspos Pola IAsyncResult selain Pola Berbasis Peristiwa
Meskipun Pola Asinkron Berbasis Peristiwa memiliki banyak manfaat di bawah skenario yang disebutkan sebelumnya, pola tersebut memang memiliki beberapa kelemahan, yang harus Anda ketahui jika performa adalah persyaratan Anda yang paling penting.
Ada tiga skenario yang tidak ditangani pola berbasis peristiwa serta IAsyncResult pola:
Memblokir tunggu pada satu IAsyncResult
Memblokir tunggu pada banyak IAsyncResult objek
Polling untuk penyelesaian pada IAsyncResult
Anda dapat mengatasi skenario ini dengan menggunakan pola berbasis peristiwa, tetapi melakukannya lebih rumit daripada menggunakan IAsyncResult pola.
Pengembang sering menggunakan IAsyncResult pola untuk layanan yang biasanya memiliki persyaratan performa yang sangat tinggi. Misalnya, polling untuk skenario penyelesaian adalah teknik server berkinerja tinggi.
Selain itu, pola berbasis peristiwa kurang efisien daripada IAsyncResult pola karena menciptakan lebih banyak objek, terutama EventArgs, dan karena disinkronkan di seluruh utas.
Daftar berikut ini memperlihatkan beberapa rekomendasi yang harus diikuti jika Anda memutuskan untuk menggunakan IAsyncResult pola:
Hanya mengekspos IAsyncResult pola ketika Anda secara khusus memerlukan dukungan untuk WaitHandle objek atau IAsyncResult.
Hanya mengekspos IAsyncResult pola saat Anda memiliki API yang ada yang menggunakan IAsyncResult pola.
Jika Anda memiliki API yang ada berdasarkan IAsyncResult pola, pertimbangkan juga untuk mengekspos pola berbasis peristiwa di rilis Anda berikutnya.
Hanya mengekspos IAsyncResult pola jika Anda memiliki persyaratan performa tinggi yang telah Anda verifikasi tidak dapat dipenuhi oleh pola berbasis peristiwa tetapi dapat dipenuhi oleh IAsyncResult pola.