2 Stimmen

Threadübergreifende CollectionChanged-Benachrichtigung?

Ich schreibe einen Download-Manager mit C#/WPF, und ich habe gerade diesen Fehler gefunden:

Dieser Typ von CollectionView unterstützt keine Änderungen an seiner SourceCollection von einem anderen Thread als dem Dispatcher-Thread.

Der grundlegende Ablauf meines Programms besteht darin, dass einige Webseiten/Downloads beim Start in eine Warteschlange gestellt werden, und dann asynchron heruntergeladen werden. Wenn eine HTML-Seite das Herunterladen abgeschlossen hat, analysiere ich sie und suche nach weiteren herunterzuladenden Dateien, die ich dann direkt aus dem Worker-Thread in die Warteschlange stelle.

Ich erhalte diese Fehlermeldung, wenn ich versuche, die CollectionChanged Ereignis für meine angepasste Warteschlangenklasse. Ich muss dieses Ereignis jedoch auslösen, damit die GUI aktualisiert werden kann.

Welche Möglichkeiten habe ich?

2voto

Erik Funkenbusch Punkte 91649

Sie sollten sich vielleicht mit dem Reaktive Erweiterungen von Microsoft, die genau für diese Art von Aufgaben konzipiert sind. Sie erstellen "beobachtbare Sammlungen" und sind in Paralell- und Multi-Core-Szenarien nützlich.

UPDATEです:

Vielleicht finden Sie auch die Syncronisationskontext ebenfalls nützlich. Das ist ein Beispiel für Windows Forms, aber es gibt auch Varianten für WPF.

1voto

John Weldon Punkte 38199

Sie müssen nur sicherstellen, dass Sie den Dispatcher für den entsprechenden Thread verwenden, um jeden Code aufzurufen, der die Sammlung aktualisiert oder das Ereignis auslöst.

http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

Update

Der Dispatcher ist eine Eigenschaft aller Klassen, die von DispatcherObject abgeleitet sind, also auch aller DependencyObjects, Visuals usw.

Ihre GUI-Objekte werden also alle eine Dispatcher-Eigenschaft haben.

1voto

wpfwannabe Punkte 14089

Wenn ich mich mit Änderungsmeldungen für Sammlungen in verschiedenen Threads befassen musste, habe ich mich immer an Wie kann ich Änderungen über Threads hinweg weitergeben? Blog-Artikel um Hilfe.

Ich bin mir nicht sicher, ob der Kontext Ihrer Frage Ihnen tatsächlich helfen kann, aber wenn Ihre Sammlung etwas ist, das Sie direkt kontrollieren, können Sie davon profitieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X