// Diese Methode schickt eine Fehlernachricht asynchron ab. Auch hierbei // werden wieder alle registrierten Abonnementen benachrichtigt. public static void SendErrorMessageAsync(ErrorMessageEventArgs eventArgs) { // Implementierung der SendErrorMessage-Methode ErrorMessageEventHandler handler; // Der Handler muss gesperrt werden, da ihn verschiedene Threads // aufrufen können. lock(_lockError) { handler = ErrorMessageFired; } // Wenn es keine Abonnementen gibt, ist der Handler NULL. if(handler != null) { // Jeder Abonnement kann in verschiedenen Threads benachrichtigt werden. Delegate[] invocationList = handler.GetInvocationList(); foreach(ErrorMessageEventHandler eventHandler in invocationList) { try { // Führe nun durch die interne Klasse den Eventhandler in allen // nötigen Threads aus. ErrorMessageEventNotifier eventNotifier = new ErrorMessageEventNotifier(eventHandler); ThreadPool.QueueUserWorkItem(eventNotifier.Start, eventArgs); } // Wenn es zu einem Fehler kommen sollte, soll nichts weiter gemacht werden // und nur der nächste Handler aufgerufen werden. catch { } } } }
static void MessageBroker_ErrorMessageFired(ErrorMessageEventArgs e) { // Verarbeite die Nachricht Console.WriteLine("Error: {0}", e.Message); if(e.Exception != null) { // Verarbeite den Fehler } }