Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Di .NET, pola desain pengamat diimplementasikan sebagai sekumpulan antarmuka. Antarmuka System.IObservable<T> mewakili penyedia data, yang juga bertanggung jawab untuk menyediakan IDisposable implementasi yang memungkinkan pengamat berhenti berlangganan dari pemberitahuan. Antarmuka System.IObserver<T> mewakili pengamat. Topik ini menjelaskan praktik terbaik yang harus diikuti pengembang saat menerapkan pola desain pengamat menggunakan antarmuka ini.
Penanganan Utas
Biasanya, penyedia menerapkan IObservable<T>.Subscribe metode dengan menambahkan pengamat tertentu ke daftar pelanggan yang diwakili oleh beberapa objek koleksi, dan mengimplementasikan IDisposable.Dispose metode dengan menghapus pengamat tertentu dari daftar pelanggan. Pengamat dapat memanggil metode ini kapan saja. Selain itu, karena kontrak penyedia/pengamat tidak menentukan siapa yang bertanggung jawab untuk berhenti berlangganan setelah IObserver<T>.OnCompleted metode panggilan balik, penyedia dan pengamat dapat mencoba menghapus anggota yang sama dari daftar. Karena kemungkinan ini, baik metode Subscribe maupun Dispose harus aman terhadap utas. Biasanya, ini melibatkan penggunaan koleksi serentak atau kunci. Implementasi yang tidak thread-safe harus secara eksplisit mendokumentasikan bahwa mereka tidak demikian.
Jaminan tambahan apa pun harus ditentukan dalam lapisan di atas kontrak penyedia/pengamat. Pelaksana harus dengan jelas menyatakan ketika mereka memberlakukan persyaratan tambahan untuk menghindari kebingungan pengguna tentang kontrak pengamat.
Menangani Pengecualian
Karena kopling longgar antara penyedia data dan pengamat, pengecualian dalam pola desain pengamat dimaksudkan untuk menjadi informasi. Ini memengaruhi bagaimana penyedia dan pengamat menangani pengecualian dalam pola desain pengamat.
Penyedia—Memanggil Metode OnError
Metode OnError ini dimaksudkan sebagai pesan informasi kepada pengamat, sama seperti metodenya IObserver<T>.OnNext . Namun, OnNext metode ini dirancang untuk memberi pengamat data saat ini atau yang diperbarui, sedangkan OnError metode dirancang untuk menunjukkan bahwa penyedia tidak dapat memberikan data yang valid.
Penyedia harus mengikuti praktik terbaik ini saat menangani pengecualian dan memanggil OnError metode :
Penyedia harus menangani pengecualiannya sendiri jika memiliki persyaratan khusus.
Penyedia tidak boleh mengharapkan atau mengharuskan pengamat menangani pengecualian dengan cara tertentu.
Penyedia harus memanggil OnError metode ketika menangani pengecualian yang mengorbankan kemampuannya untuk memberikan pembaruan. Informasi tentang pengecualian tersebut dapat diteruskan ke pengamat. Dalam kasus lain, tidak perlu memberi tahu pengamat tentang pengecualian.
Setelah penyedia memanggil OnError metode atau IObserver<T>.OnCompleted , seharusnya tidak ada pemberitahuan lebih lanjut, dan penyedia dapat berhenti berlangganan pengamatnya. Namun, pengamat juga dapat berhenti berlangganan sendiri kapan saja, termasuk sebelum dan sesudah mereka menerima pemberitahuan OnError atau IObserver<T>.OnCompleted. Pola desain pengamat tidak menentukan apakah penyedia atau pengamat bertanggung jawab untuk berhenti berlangganan; oleh karena itu, ada kemungkinan bahwa keduanya dapat mencoba berhenti berlangganan. Biasanya, ketika pengamat berhenti berlangganan, mereka dihapus dari koleksi pelanggan. Dalam aplikasi yang berjalan pada utas tunggal, implementasi IDisposable.Dispose harus memastikan bahwa referensi objek adalah valid dan bahwa objek tersebut adalah anggota dari koleksi pendaftar sebelum mencoba menghapusnya. Dalam aplikasi multithreaded, objek koleksi yang aman untuk digunakan dalam beberapa utas, seperti objek System.Collections.Concurrent.BlockingCollection<T>, harus digunakan.
Pengamat—Menerapkan Metode OnError
Ketika pengamat menerima pemberitahuan kesalahan dari penyedia, pengamat harus memperlakukan pengecualian sebagai informasi dan tidak boleh diperlukan untuk mengambil tindakan tertentu.
Pengamat harus mengikuti praktik terbaik ini saat menanggapi OnError panggilan metode dari penyedia:
Pengamat tidak boleh melemparkan pengecualian dari implementasi antarmukanya, seperti OnNext atau OnError. Namun, jika pengamat melemparkan pengecualian, pengecualian ini akan tetap tidak tertangani.
Untuk mempertahankan tumpukan panggilan, pengamat yang ingin melempar objek Exception yang diteruskan ke metode OnError miliknya harus membungkus pengecualian sebelum melemparkannya. Objek pengecualian standar harus digunakan untuk tujuan ini.
Praktik Terbaik Tambahan
Mencoba membatalkan pendaftaran di metode IObservable<T>.Subscribe dapat mengakibatkan referensi null. Oleh karena itu, kami sarankan Anda menghindari praktik ini.
Meskipun dimungkinkan untuk melampirkan pengamat ke beberapa penyedia, pola yang direkomendasikan adalah melampirkan instance IObserver<T> ke hanya satu instance IObservable<T>.