Ich verwende die WeakEventManager<TEventSource, TEventArgs>
Klasse in der richtigen Reihenfolge Ereignisse in C # abonnieren Event Subscription funktioniert gut, aber ruft WeakEventManager<TEventSource, TEventArgs>.RemoveHandler
von einem Task
entfernt nicht immer den Handler - am meisten (aber nicht alle) der Zeit, zu der der Handler noch ausgeführt wird, wenn das Ereignis ausgelöst wird.
Dies wird im folgenden Beispiel veranschaulicht.
%Vor%Der Handler wird die ganze Zeit entfernt, aber in den meisten Fällen wird das Ereignis noch behandelt.
Mache ich einen Fehler in der Art, wie diese Methoden aufgerufen werden? Unterstützen diese Methoden den asynchronen Aufruf? Gibt es einen alternativen Ansatz, der funktionieren würde?
Vielen Dank für Ihre Hilfe im Voraus.
Dies liegt daran, dass WeakEventManager
in einem aktuellen WeakEventTable
gespeichert sind, das für den aktuellen Thread initialisiert wurde ( Quelle ):
Und Sie verwenden den Thread-Pool-Task-Sheduler, der der Standard-Sheduler ist. Es ruft manchmal AddHandler
und RemoveHandler
im selben Thread auf. Aber manchmal ruft sie RemoveHandler
in einem anderen Thread auf und Sie haben ein anderes WeakEventManager
ohne die angeforderte EventSource
.
HINWEIS: Wenn ein Typ von DispatcherObject
erbt, sind Instanzen dieses Typs von dem Thread abhängig, in dem sie erstellt werden. Wenn ein DispatcherObject
Singleton ist, wird es pro Thread erstellt.
Wenn Sie also DispatcherObject
sehen, dann rufen Sie ihre Methoden nur aus dem Thread auf, in dem sie erstellt wurde. Andernfalls haben Sie Probleme.
Tags und Links .net c# asynchronous