/// <summary> /// Feuert das Notify-Ereignis auf dem Client. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void FireNotifyEvent(object sender, NotificationEventArgs e) { // Wenn eine Ereignisprozedur registriert ist ... if (_clientHandler != null) // Ereignisprozedur aufrufen _clientHandler(this, e); }
/// <summary> /// Behandelt ein Ereignis einer Serverkomponente. /// </summary> /// <param name="sender">Herkunftsobjekt</param> /// <param name="e">Ereignisargumente</param> public void HandleServerEvent(object sender, NotificationEventArgs e) { // Ereignis feuern und Benachrichtigungen an die Clients versenden _service.RaiseEvent(_eventName, e.Message); }
/// <summary> /// Versendet Benachrichtigungen über ein bestimmtes Ereignis an alle Registrierten Clients. /// </summary> /// <param name="eventName">Ereignisname</param> /// <param name="e">Ereignisargumente</param> private void OnServerEvent(string eventName, NotificationEventArgs e) { lock (_lockObject) { // Wenn für ein Ereignis mit dem angegebnen Namen Registrierungen vorhanden sind ... if (_subscriptions.ContainsKey(eventName) && _subscriptions[eventName] != null) { // Variablen für Ereignis-Delegaten und die Aufrufliste EventHandler<NotificationEventArgs> eventDelegate = null; Delegate[] invocationList = null; try { // Aufrufliste des Ereignisses abrufen invocationList = _subscriptions[eventName].GetInvocationList(); } catch (MemberAccessException ex) { // Ausnahme weiterwerfen throw ex; } // Wenn die Aufrufliste abgerufen werden konnte ... if (invocationList != null) { // Alle Einträge der Aufrufliste durchlaufen foreach (Delegate invocationItem in invocationList) { // Aufruf in entsprechenden Delegattypen casten eventDelegate = (EventHandler<NotificationEventArgs>)invocationItem; // Delegaten auf asynchrone Sende-Methode erzeugen AsyncNotificationDelegate innerDelegate = new AsyncNotificationDelegate(BeginSend); // Benachrichtigung asynchron versenden innerDelegate.BeginInvoke(eventName, e, eventDelegate, null, null); } } } } }
/// <summary> /// Sendet eine Ereignisbenachrichtigung asynchron. /// </summary> /// <param name="eventName">Ereignisname</param> /// <param name="e">Ereignisargumente</param> /// <param name="eventDelegate">Delegat auf registrierte Client-Ereignisprozedur</param> private void BeginSend(string eventName, NotificationEventArgs e, EventHandler<NotificationEventArgs> eventDelegate) { try { // Versuchen, Benachrichtigung an den Client zu senden eventDelegate(null, e); } catch (Exception) { // Benachrichtigung fehlgeschlagen! Registrierung aufheben _subscriptions[eventName] -= eventDelegate; } }