WeakEventManager RemoveHandler funktioniert nicht immer beim asynchronen Aufruf

8

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.

    
mickeyt 09.03.2015, 15:16
quelle

1 Antwort

6

Dies liegt daran, dass WeakEventManager in einem aktuellen WeakEventTable gespeichert sind, das für den aktuellen Thread initialisiert wurde ( Quelle ):

%Vor%

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.

    
Yoh Deadfall 09.03.2015, 19:23
quelle

Tags und Links