C# - Eigene Events - Beispiel anhand einer E-Mail-Überwachung

C# - Eigene Events - Beispiel anhand einer E-Mail-Überwachung

Dieser Codeschnippsel soll exemplarisch zeigen, wie man in C# eigene Events definiert.

Als Beispiel dient hier die Überwachung von E-Mails in der Konsole.

    /// <summary>
    /// Ein Objekt dieser Klasse wird an den Ereignis-Abonnenten geliefert
    /// </summary>
    public class NeueEMailArgs : EventArgs
    {
        // Eigenschaften, die uns in diesem Beispiel interessiere.
        // Können nach Bedarf erweitert werden.
        public String Betreff { get; private set; }
        public String Absender { get; private set; }

        // Konstruktor mit den Standard-Parametern, die wir als Pflicht ansehen
        public NeueEMailArgs( String absender, String betreff )
        {
            // Zuweisen
            this.Betreff = betreff;
            this.Absender = absender;
        }
    }

    /// <summary>
    /// Klasse, die ein Postfach überwacht und über neue EMail benachrichtigt
    /// </summary>
    public class EMailUeberwachung
    {
        /// <summary>
        /// Das Postfach, das überwacht werden soll
        /// </summary>
        private readonly MailPostfach _mailPostfach;

        /// <summary>
        /// Konstrktor, der das Postfach empfängt, das er überwachen soll
        /// </summary>
        /// <param name="mailPostfach"></param>
        public EMailUeberwachung( MailPostfach mailPostfach )
        {

            _mailPostfach = mailPostfach;
        }

        public delegate void MyNeueEMailHandler( object sender, NeueEMailArgs e );

        // Definieren eines Event Handlers
        public event MyNeueEMailHandler OnNeueEMail;

        /// <summary>
        /// Diese Methode feuert letzten Endes das Ereignis ab.
        /// Der Abonnent erhält die Informationen, die wir ihm über die Ereignisargumente geben.
        /// </summary>
        /// <param name="e"></param>
        private void FeuerNeueEMail( NeueEMailArgs e )
        {
            // Prüfen, ob überhaupt irgendjemand den Event abonniert hat
            if ( OnNeueEMail != null )
            {
                // Ja, der Event hat mindestens einen Abonnenten
                OnNeueEMail( this, e );
            }
        }

        public void Start( )
        {
            // Hier befindet sich nun die Logik, die das Postfach überwachen soll
            // ....

            // Es wurde eine neue Mail gefunden
            var emailArgs = new NeueEMailArgs( "[email protected]", "Es wurde eine neue Mail empfangen" );

            // Event abfeuern
            FeuerNeueEMail( emailArgs );
        }
    }
    /// <summary>
    /// Inhalt nicht definiert; dient hier nur zur Komplettierung des Beispiels
    /// </summary>
    public class MailPostfach
    {

    }

    /// <summary>
    /// Die eigentliche Anwendung
    /// </summary>
    public class Programm
    {
        public static void Main( params String[ ] args )
        {
            // Definieren unseres Postfachs
            var myPostfach = new MailPostfach( );

            // Damit die Ovberfläche bedienbar bleibt, während im Hintergrund nach neuen Mails geschaut wird, lagern wir die Überwachung in einen eigenen Task aus.
            var eMailueberwachungTask = Task.Factory.StartNew( ( ) =>
                {
                    // Starten der E-Mail-Überwachung
                    EMailUeberwachung mailUeberwachung = new EMailUeberwachung( myPostfach );

                    mailUeberwachung.OnNeueEMail += OnNeueEMail;
                } );

            // Auf Beenden des Benutzers warten.
            Console.WriteLine( "Die E-Mail überwachung ist aktiv. Drücken Sie eine Taste nach Wahl um die Anwendung zu beenden." );
            Console.ReadKey( );

            // Ein sauberes Beenden des Tasks der E-Mail-Überwachung würde über den CancellationTokenSource laufen;
            // dies soll aber nicht Bestandteil dieses Beispielssein

            // Anwendung wird beendet

        }

        /// <summary>
        /// Diese Methode wird aufgerufen, wenn die Überwachung eine neue E-Mail erhält.
        /// Achtung: Invoke bei Zugriff auf den GUI-Thread nötig, da Hintergrund-Task.
        /// </summary>
        static void OnNeueEMail( object sender, NeueEMailArgs e )
        {
            Console.WriteLine( "[!!!] Neue EMail: Absender: " + e.Absender + "- Betreff: " + e.Betreff );
        }
    }