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 );
}
}