Dela via


Så här prenumererar du på och avbryter prenumerationen på händelser (C#-programmeringsguide)

Du prenumererar på en händelse som publiceras av en annan klass när du vill skriva anpassad kod som anropas när händelsen aktiveras. Du kan till exempel prenumerera på en knapps click händelse för att programmet ska göra något användbart när användaren klickar på knappen.

Prenumerera på händelser med hjälp av Visual Studio IDE

  1. Om du inte kan se fönstret Egenskaper högerklickar du på formuläret eller kontrollen som du vill skapa en händelsehanterare för i designvyn och väljer Egenskaper.

  2. Klicka på ikonen Händelser överst i fönstret Egenskaper.

  3. Dubbelklicka på den händelse som du vill skapa, till exempel händelsen Load .

    Visual C# skapar en tom händelsehanterarmetod och lägger till den i koden. Du kan också lägga till koden manuellt i kodvyn . Följande kodrader deklarerar till exempel en händelsehanterarmetod som anropas när Form klassen genererar Load händelsen.

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Add your form load event handling code here.
    }
    

    Den kodrad som krävs för att prenumerera på händelsen genereras också automatiskt i InitializeComponent metoden i Form1.Designer.cs-filen i projektet. Det liknar detta:

    this.Load += new System.EventHandler(this.Form1_Load);  
    

Prenumerera på händelser programmatiskt

  1. Definiera en händelsehanterarmetod vars signatur matchar delegatsignaturen för händelsen. Om händelsen till exempel baseras på ombudstypen EventHandler representerar följande kod metoden stub:

    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    }  
    
  2. Använd additionstilldelningsoperatorn (+=) för att koppla en händelsehanterare till händelsen. Anta i följande exempel att ett objekt med namnet publisher har en händelse med namnet RaiseCustomEvent. Observera att prenumerantklassen behöver en referens till utgivarklassen för att kunna prenumerera på dess händelser.

    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    Du kan också använda ett lambda-uttryck för att ange en händelsehanterare:

    public Form1()  
    {  
        InitializeComponent();  
        this.Click += (s,e) =>
            {
                MessageBox.Show(((MouseEventArgs)e).Location.ToString());
            };
    }  
    

Prenumerera på händelser med hjälp av en anonym funktion

Om du inte behöver avbryta prenumerationen på en händelse senare kan du använda additionstilldelningsoperatorn (+=) för att koppla en anonym funktion som händelsehanterare. I följande exempel antar du att ett objekt med namnet publisher har en händelse med namnet RaiseCustomEvent och att en CustomEventArgs klass också har definierats för att ha någon form av specialiserad händelseinformation. Observera att prenumerantklassen behöver en referens till publisher för att prenumerera på dess händelser.

publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{  
  string s = o.ToString() + " " + e.ToString();  
  Console.WriteLine(s);  
};  

Du kan inte enkelt avbryta prenumerationen på en händelse om du har använt en anonym funktion för att prenumerera på den. Om du vill avbryta prenumerationen i det här scenariot går du tillbaka till koden där du prenumererar på händelsen, lagrar den anonyma funktionen i en delegatvariabel och lägger sedan till ombudet i händelsen. Vi rekommenderar att du inte använder anonyma funktioner för att prenumerera på händelser om du måste avbryta prenumerationen på händelsen någon gång senare i koden. Mer information om anonyma funktioner finns i Lambda-uttryck.

Avprenumerera

Om du vill förhindra att händelsehanteraren anropas när händelsen aktiveras avbryter du prenumerationen på händelsen. För att förhindra resursläckor bör du avbryta prenumerationen på händelser innan du gör dig av med ett prenumerantobjekt. Tills du avregistrerar dig från en händelse har multicast-ombudet som ligger till grund för händelsen i publiceringsobjektet en referens till ombudet som kapslar in prenumerantens händelsehanterare. Så länge publiceringsobjektet innehåller den referensen tar skräpinsamlingen inte bort prenumerantobjektet.

Så här avbryter du prenumerationen på en händelse

  • Använd subtraktionstilldelningsoperatorn (-=) för att avbryta prenumerationen på en händelse:

    publisher.RaiseCustomEvent -= HandleCustomEvent;  
    

    När alla prenumeranter har avslutat prenumerationen på en händelse är händelseinstansen i utgivarklassen inställd på null.

Se även