Cara berlangganan dan berhenti berlangganan dari peristiwa (Panduan Pemrograman C#)
Anda berlangganan peristiwa yang diterbitkan oleh kelas lain saat Anda ingin menulis kode kustom yang dipanggil saat peristiwa tersebut dimunculkan. Misalnya, Anda mungkin berlangganan peristiwa click
tombol untuk membuat aplikasi Anda melakukan sesuatu yang berguna saat pengguna mengeklik tombol.
Untuk berlangganan peristiwa dengan menggunakan IDE Visual Studio
Jika Anda tidak dapat melihat jendela Properti, dalam tampilan Desain, klik kanan formulir atau kontrol tempat Anda ingin membuat penanganan aktivitas, dan pilih Properti.
Di atas jendela Properti, klik ikon Peristiwa.
Klik dua kali peristiwa yang ingin Anda buat, misalnya peristiwa
Load
.Visual C# membuat metode penanganan aktivitas kosong dan menambahkannya ke kode Anda. Atau Anda dapat menambahkan kode secara manual dalam tampilan Kode. Misalnya, baris kode berikut mendeklarasikan metode penanganan aktivitas yang akan dipanggil saat kelas
Form
memunculkan peristiwaLoad
.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
Baris kode yang diperlukan untuk berlangganan peristiwa juga dibuat secara otomatis dalam metode
InitializeComponent
di file Form1.Designer.cs di proyek Anda. Baris kode mirip seperti:this.Load += new System.EventHandler(this.Form1_Load);
Untuk berlangganan peristiwa secara terprogram
Tentukan metode penanganan aktivitas yang tanda tangannya cocok dengan tanda tangan delegasi untuk peristiwa tersebut. Misalnya, jika peristiwa didasarkan pada jenis delegasi EventHandler, kode berikut mewakili potongan metode:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Gunakan operator penugasan tambahan (
+=
) untuk melampirkan penanganan aktivitas ke peristiwa tersebut. Dalam contoh berikut, asumsikan bahwa objek bernamapublisher
memiliki peristiwa bernamaRaiseCustomEvent
. Perhatikan bahwa kelas pelanggan memerlukan referensi ke kelas penerbit untuk berlangganan peristiwa.publisher.RaiseCustomEvent += HandleCustomEvent;
Anda juga dapat menggunakan ekspresi lambda untuk menentukan penanganan aktivitas:
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
Untuk berlangganan peristiwa dengan menggunakan fungsi anonim
Jika nanti Anda tidak perlu berhenti berlangganan dari peristiwa, Anda dapat menggunakan operator penugasan tambahan (+=
) untuk melampirkan fungsi anonim sebagai penanganan aktivitas. Dalam contoh berikut, asumsikan bahwa objek bernama publisher
memiliki peristiwa bernama RaiseCustomEvent
dan kelas CustomEventArgs
juga telah ditetapkan untuk membawa beberapa jenis informasi peristiwa khusus. Perhatikan bahwa kelas pelanggan memerlukan referensi ke publisher
untuk berlangganan peristiwanya.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Anda tidak dapat dengan mudah berhenti berlangganan dari peristiwa jika Anda menggunakan fungsi anonim untuk berlangganan ke peristiwa tersebut. Untuk berhenti berlangganan dalam skenario ini, kembali ke kode tempat Anda berlangganan peristiwa, simpan fungsi anonim dalam variabel delegasi, lalu tambahkan delegasi ke peristiwa. Sebaiknya Anda tidak menggunakan fungsi anonim untuk berlangganan peristiwa jika Anda harus berhenti berlangganan peristiwa di beberapa titik nanti dalam kode Anda. Untuk informasi selengkapnya tentang fungsi anonim, lihat Ekspresi Lambda.
Berhenti berlangganan
Untuk mencegah penanganan aktivitas Anda dipanggil saat peristiwa dimunculkan, berhenti berlangganan dari peristiwa tersebut. Untuk mencegah kebocoran sumber daya, Anda harus berhenti berlangganan dari peristiwa sebelum membuang objek pelanggan. Sampai Anda berhenti berlangganan dari peristiwa, delegasi multicast yang mendasari peristiwa di objek penerbitan memiliki referensi ke delegasi yang menyertakan penanganan aktivitas pelanggan. Selama objek penerbitan menyimpan referensi tersebut, pengumpulan sampah tidak akan menghapus objek pelanggan Anda.
Untuk berhenti berlangganan dari peristiwa
Gunakan operator penugasan pengurangan (
-=
) untuk berhenti berlangganan dari peristiwa:publisher.RaiseCustomEvent -= HandleCustomEvent;
Ketika semua pelanggan telah berhenti berlangganan dari peristiwa, instans peristiwa di kelas penerbit diatur ke
null
.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk