Frage

In einer WPF-Anwendung hatte ich einen Background Thread ein Objekt zu schaffen. Lassen Sie uns das Objekt foo nennen.

Hintergrund Arbeiter Code:

SomeClass foo = new SomeClass();
// Do some operation on foo

// Set some dependency property on the main class to foo
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
    (SendOrPostCallback)delegate { SetValue(FooProperty, foo); },
    foo);

Nun, wenn die Hauptklasse FooProperty mit einem Getter zuzugreifen versucht, erhalte ich eine InvalidOperationException: Der aufrufende Thread dieses Objekt nicht zugreifen, da ein anderer Thread es besitzt

.

Wenn der Thread die das Objekt erstellen ist abgeschlossen, warum es noch Eigentümer das Objekt? Gibt es irgendwie um dieses.?

War es hilfreich?

Lösung

Ein Objekt, das Sie in einem bestimmten Thread erstellt wird von diesem Thread gehört. Das ist, warum Sie eine InvalidOperationException bekommen. Wenn Sie eine Immobilie in einem Hintergrundthread setzen möchte, empfehlen, die ich der Delegat den gewünschten Wert zurück und SetValue von Ihrem Haupt-Thread aufrufen. (Faden, der das Objekt erzeugt).

Andere Tipps

Die überwiegende Mehrheit der Objekte in WPF hat Thread-Affinität. Das ist einmal auf einem bestimmten Thread erstellt, ein WPF Objekt wird dann funktionieren nur, wenn sie von diesem Thread verwendet. Diese Einschränkung wird erzwungen (im Gegensatz zu WinForms) auf praktisch jede Operation, die Sie auf diesem Objekt tun.

Sie müssen den Code ändern müssen Foo für dieses Szenario auf den tatsächlichen UI-Thread erstellt.

Unter der Annahme SomeClass aus DispatcherObject abgeleitet, der Faden, der sie erstellt läuft die Nachricht Pumpe, die für die Verarbeitung von Meldungen für das foo Objekt verantwortlich ist. Deshalb, wenn dieser Thread endet dann kann das Objekt nicht mehr Nachrichten verarbeiten, die keine gute Idee ist.

In den meisten Fällen sollten Sie die gleiche UI-Thread verwenden, um alle Ihre UI-Objekte zu erstellen (oder irgendetwas anderes, das von DispatcherObject abgeleitet ist und sicherstellen, dass es für die Dauer der Anwendung ausgeführt wird. Dann die Dispatcher verwenden, um Nachrichten an sie senden von Ihrem Arbeitsthreads.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top