Introduktion till händelser

Föregående

Händelser är, som ombud, en sen bindningsmekanism . Faktum är att händelser bygger på språkstöd för delegater.

Händelser är ett sätt för ett objekt att sända (till alla intresserade komponenter i systemet) att något har hänt. Alla andra komponenter kan prenumerera på händelsen och meddelas när en händelse aktiveras.

Du har förmodligen använt händelser i en del av din programmering. Många grafiska system har en händelsemodell för att rapportera användarinteraktion. Dessa händelser rapporterar musrörelser, knapptryckningar och liknande interaktioner. Det är ett av de vanligaste, men absolut inte det enda scenariot där händelser används.

Du kan definiera händelser som ska aktiveras för dina klasser. En viktig faktor när du arbetar med händelser är att det kanske inte finns något objekt registrerat för en viss händelse. Du måste skriva koden så att den inte genererar händelser när inga lyssnare har konfigurerats.

När du prenumererar på en händelse skapas också en koppling mellan två objekt (händelsekällan och händelsemottagaren). Du måste se till att händelsens mottagare avregistrerar sig från händelsekällan när den inte längre är intresserad av händelser.

Designmål för händelsesupport

Språkdesignen för händelser är inriktad på följande mål:

  • Aktivera mycket minimal koppling mellan en händelsekälla och en händelsemottagare. Dessa två komponenter kanske inte skrivs av samma organisation och kan till och med uppdateras enligt helt olika scheman.

  • Det bör vara mycket enkelt att prenumerera på en händelse och att avbryta prenumerationen på samma händelse.

  • Händelsekällor bör ha stöd för flera händelseprenumeranter. Det bör också ha stöd för att inga händelseprenumeranter är anslutna.

Du kan se att målen för händelser liknar målen för delegater. Därför bygger stöd för händelsespråket på stöd för ombudsspråk.

Språkstöd för händelser

Syntaxen för att definiera händelser och prenumerera eller avprenumerera från händelser är en förlängning av syntaxen för ombud.

Om du vill definiera en händelse använder du nyckelordet event :

public event EventHandler<FileListArgs> Progress;

Typen av händelse (EventHandler<FileListArgs> i det här exemplet) måste vara en ombudstyp. Det finns ett antal konventioner som du bör följa när du deklarerar en händelse. Vanligtvis har händelsedelegattypen en ogiltig retur. Händelsedeklarationer ska vara ett verb eller en verbfras. Använd tidigare tempus när händelsen rapporterar något som har hänt. Använd ett aktuellt tempusverb (till exempel Closing) för att rapportera något som håller på att hända. Att använda presens indikerar ofta att din klass stöder någon form av anpassningsbeteende. Ett av de vanligaste scenarierna är att stödja annullering. En händelse kan till exempel Closing innehålla ett argument som anger om stängningsåtgärden ska fortsätta eller inte. Andra scenarier kan göra det möjligt för anropare att ändra beteende genom att uppdatera egenskaperna för händelseargumenten. Du kan skapa en händelse för att ange en föreslagen nästa åtgärd som en algoritm kommer att vidta. Händelsehanteraren kan kräva en annan åtgärd genom att ändra egenskaperna för händelseargumentet.

När du vill skapa händelsen anropar du händelsehanterarna med hjälp av syntaxen för delegerat anrop:

Progress?.Invoke(this, new FileListArgs(file));

Som beskrivs i avsnittet om ombud, ?. operatören gör det enkelt att se till att du inte försöker skapa händelsen när det inte finns några prenumeranter på händelsen.

Du prenumererar på en händelse med hjälp av operatorn += :

EventHandler<FileListArgs> onProgress = (sender, eventArgs) =>
    Console.WriteLine(eventArgs.FoundFile);

fileLister.Progress += onProgress;

Hanteringsmetoden har vanligtvis prefixet "På" följt av händelsenamnet, som visas ovan.

Du avbryter prenumerationen med operatorn -= :

fileLister.Progress -= onProgress;

Det är viktigt att du deklarerar en lokal variabel för uttrycket som representerar händelsehanteraren. Det säkerställer att avregistreringen tar bort hanteraren. Om du i stället använde lambda-uttryckets brödtext försöker du ta bort en hanterare som aldrig har kopplats, vilket inte gör någonting.

I nästa artikel får du lära dig mer om typiska händelsemönster och olika variationer i det här exemplet.

Nästa