Bagikan melalui


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

  1. Jika Anda tidak dapat melihat jendela Properti, dalam tampilan Desain, klik kanan formulir atau kontrol tempat Anda ingin membuat penanganan aktivitas, dan pilih Properti.

  2. Di atas jendela Properti, klik ikon Peristiwa.

  3. 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 peristiwa Load.

    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

  1. 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.  
    }  
    
  2. Gunakan operator penugasan tambahan (+=) untuk melampirkan penanganan aktivitas ke peristiwa tersebut. Dalam contoh berikut, asumsikan bahwa objek bernama publisher memiliki peristiwa bernama RaiseCustomEvent. 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