Weiterleiten / Weiterleiten von .NET-Ereignissen

7

Meine Klasse hat ein Ereignis, das externe Objekte abonnieren:

%Vor%

Ein internes Listener-Objekt, das auf seinem eigenen Thread läuft, wird jedoch tatsächlich das Ereignis erzeugen.

%Vor%

Ich möchte ein Ereignis mit der gleichen Signatur auf dem Listener erstellen und es in der Hauptklasse abonnieren, um es für MessageReceived zu erhöhen. Das scheint ein wenig beschwerlich zu sein, also habe ich mich gefragt, ob es eine ordentliche / idiomatische Art gibt, Ereignisse wie diese weiterzuleiten.

    
marijne 01.06.2009, 14:23
quelle

3 Antworten

22

Sie können das Ereignis Hinzufügen / Entfernen von Zugriffsmethoden verwenden, sodass Ereignisse mit der externen Ausrichtung verknüpft werden Ereignis wird an den internen Listener "weitergeleitet"

%Vor%

Dies bedeutet, dass Sie ein Ereignis im Listener erstellen müssen, aber der Vorteil ist, dass es keine anderen Installationen gibt, um das Ereignis zu verkabeln.

    
Ryan Emerle 01.06.2009, 14:29
quelle
1

Sie könnten dies mit einem Ereignis tun, oder Sie könnten eine Methode in Ihrer Hauptklasse namens ReceiveMessage () erstellen und diese vom Listener aufrufen (und dann das Ereignis von dort auslösen).

    
Jon B 01.06.2009 14:28
quelle
1

Wie bereits erwähnt, können Sie eine benutzerdefinierte Abonnementlogik verwenden, indem Sie Handler für Ihre Veranstaltung hinzufügen und entfernen.

Beachten Sie, dass dieses Design ein Problem hat, wie es ist. Sie geben an, dass Ihr Listener das Ereignis in einem eigenen Thread auslöst. Standardmäßig werden die Handler für den Thread aufgerufen, der das Ereignis ausgelöst hat (in Ihrem Fall der Thread des Listeners). Sie haben mehrere Möglichkeiten.

  • Wenn Sie nicht möchten, dass der Listener-Thread die Callbacks ausführt. Rufen Sie das Ereignis einfach so auf (aber Ihr Listener-Thread kann blockiert werden, wenn ein Eventhandler zur Ausführung eine Weile benötigt oder einfach stirbt, wenn ein Ereignishandler eine nicht behandelte Ausnahme auslöst)
  • Wenn Sie möchten, dass die Handler in anderen Threads als dem Listener-Thread ausgeführt werden, aber nicht in Threads, solange sie nicht im Listener sind: Rufen Sie in der OnXXX-Methode, die die Handler tatsächlich aufruft, die Aufrufliste des Ereignis und Warteschlange jeden Handler im threadpool.
  • Wenn Sie möchten, dass die Handler in bestimmten Threads aufgerufen werden: ein bisschen knifflig, müssen Sie einige SynchronizationContext (WindowsSynchronizationContext in Winforms, eine benutzerdefinierte in anderen Fällen, etc.)

Es gibt einen Blogbeitrag von Roy Osherove, der verschiedene Möglichkeiten zum Ausführen der Async-Aufrufe zeigt: Ссылка (Aber ich würde die asynchronen Aufrufe von Delegaten nicht verwenden und stattdessen direkt auf den ThreadPool zurückgreifen, um die Delegierten aufzurufen.)

    
Yann Schwartz 01.06.2009 14:54
quelle

Tags und Links