Äquivalent von PostMessage in C# für die Synchronisation mit dem Hauptthread mit MVVM?

Muss ich zurückgeblieben mit der Suche, weil hier ein scheinbar häufiges problem, dass ich nicht in der Lage zu lösen.

Hier ist mein problem -- ich verwende WPF und MVVM, und ich habe eine statemachine, die ausgeführt wird, in das Modell. Wenn ein Fehler Auftritt, muss ich weiterleiten information an das ViewModel, um den Fehler anzuzeigen. Dieser Teil scheint zu funktionieren okay. Wenn der Benutzer auf das gewünschte Verhalten, wird der code in das Modell weiterhin, und schaut auf das Objekt, das der Benutzer interagiert mit zu bestimmen, was als Nächstes zu tun ist.

Das problem ist, dass das Modell braucht zum laden einer Datei, die aktualisiert die GUI, die mit dem Inhalt der besagten Datei. Da das Modell die Ausführung in einem thread, kann man sich vorstellen, was werde ich als Nächstes Fragen -- wie zur Hölle Sie die Synchronisierung mit dem GUI richtig? In MFC, hätte ich entweder SendMessage oder PostMessage zu erreichen, die GUI zu aktualisieren.

Habe ich Lesen Sie Artikel für WinForms legen nahe, dass mithilfe von InvokeRequired automatisch Aufruf von BeginInvoke, wenn nötig. Ich konnte ja nicht wissen, dass BeginInvoke erfüllen würde, was ich wollte, also wurde ich ermutigt, das zu lernen.

Wie kann ich eigentlich Aufruf von BeginInvoke von meinem Modell? Funktioniert diese Methode auch anwenden zu WPF? Ich ging weiter und implementiert einen Delegierten und rief dann Aufrufen, aber ich bekomme die gleiche Fehlermeldung, die mir sagt, die Auflistung kann nicht geändert werden, aus diesem thread. Ich habe auch versucht BeginInvoke für die Hölle der es, aber ich gehe davon aus, dass auch nicht funktionieren würde, weil es würde nur starten, aus einem anderen thread sowieso.

Verwirrt. Wenn ich etwas verpasst haben offensichtlich wirklich, dass die veröffentlicht worden ist über alle über das internet, gehen Sie vor und geben Sie mir eine verbale Auspeitschung, die ich wahrscheinlich haben es sich verdient.

BEARBEITEN - ich sollte wohl noch hinzufügen, dass ich bin auf der Suche nach etwas anderes als ein timer oder BackgroundWorker-basierte Lösung, es sei denn, dass die nur Weg, um dieses Problem zu lösen in WPF /MVVM. Außerdem Frage ich mich, wenn eine der MVVM-toolkits hätte-Einrichtungen für diese Art der Sache schon...

  • Um es klarzustellen: ich nehme an, Sie waren einfach aufrufen von Invoke() auf die Delegierte direkt, anstatt Dispatcher.Invoke()? Die erste wird einfach ausgeführt die Delegierten auf dem gleichen thread, der zweite Marschall der Anruf an den Dispatcher thread (die möglicherweise oder möglicherweise nicht vorhanden, je nach Art der Anwendung verbraucht dein ViewModel).
  • Wayne, du hast Recht. Ich war nur grob nach dem Artikel, und ich Frage mich, ob die Tatsache, dass es für WinForms ist, warum Ihr Beispiel funktioniert? Wie auch immer, ich denke, Franci war richtig und ich übergeben zu müssen, in einen Dispatcher mit allen notwendigen Mitteln. 🙂 Vielen Dank für Ihre Zeit. Hoffentlich kann ich das bald gelöst.
  • Seine möglich, Sie nutzen könnten MVVMLights Messenger-Klasse zum senden einer Nachricht an die GUI ohne den Umweg über die Vielseitigkeit. Sie würde immer noch gehen durch den Dispatcher, wenn der Code Hinter berührt eine der tatsächlichen Benutzeroberfläche. Ich bin ein wenig verwirrt, da Databinding geht schon durch den Dispatcher warum ist das ein Problem. Wenn dein Thread aktualisiert eine gebundene Eigenschaft auf der Ansicht, es sollte automatisch gemarshallt werden, um das UI, ohne ein problem.
InformationsquelleAutor Dave | 2010-03-09
Schreibe einen Kommentar