Ich entwerfe gerade den Databinding-Teil einer Anwendung, die Winforms-Datenbindungen und -Updates nutzt, die von einem Hintergrundthread kommen (einmal pro Sekunde bei> 100 Datensätzen).WinForms Multithread-Databinding-Szenario, Best Practice?
Nehmen wir an, die Anwendung ist eine Börsenhandelsanwendung, bei der ein Hintergrundthread Datenänderungen überwacht und sie auf die Datenobjekte setzt. Diese Objekte werden in einem BindingList<>
gespeichert und implementieren INotifyPropertyChanged
, um die Änderungen über Datenbindung an die Winforms-Steuerelemente zu übermitteln. Außerdem ordnen die Datenobjekte derzeit die Änderungen per WinformsSynchronizationContext.Send
dem UI-Thread zu. Der Benutzer kann einige Werte auf der Benutzeroberfläche eingeben, was bedeutet, dass einige Werte von beiden Seiten geändert werden können. Und die Benutzerwerte sollten nicht durch Updates überschrieben werden.
So gibt es mehrere Frage meiner Meinung nach kommen:
- Gibt es eine allgemeine Design-Guildline, wie das zu tun (Hintergrund-Updates in Datenbindung)?
- Wann und wie auf dem UI-Thread marshale?
- Was ist der beste Weg des Hintergrundthreads zur Interaktion mit Binding/Datenobjekte?
- Welche Klassen/Interfaces sollten verwendet werden? (Binding, ...)
- ...
Die Benutzeroberfläche ist nicht wirklich wissen, dass es einen Hintergrund-Thread ist, dass die Steuerung aktualisiert, und wie mein Verständnis in Datenbindung Szenarien der UI shouldn‘ Ich weiß, woher die Daten kommen ... Sie können sich den Hintergrund-Thread als etwas vorstellen, das Daten an die Benutzeroberfläche weitergibt. Ich bin mir also nicht sicher, ob der Hintergrundarbeiter die Option ist, nach der ich suche.
Manchmal möchten Sie eine UI-Antwort während einer Operation im Daten-/Geschäftsobjekt erhalten (z. B. Hintergrund bei Neuberechnungen einstellen). Das Erhöhen einer Eigenschaft, die an einer Statuseigenschaft geändert wurde, die an den Hintergrund gebunden ist, reicht nicht aus, da die Steuerelemente nach Abschluss der Berechnung neu gezeichnet werden. Meine Idee wäre, das propertychanged Ereignis anzuhängen und .update() auf dem Steuerelement ... Irgendwelche anderen Ideen darüber zu nennen?
System.ComponentModel.BackgroundWorker, kann einen Teil der Lösung sein, aber das harte Problem ist, wie die Daten zu halten aktualisiert schnell, ohne den UI-Thread Blick. Tun Sie das oben, ohne dass jede andere Codezeile über Sperren oder Cross-Thread-Aufrufe nachdenken muss. –
Wenn man sich den Backgroundworker anschaut, gibt es keinen großen Unterschied, einen Thread zu erzeugen und mit WindowsFormsSynchronizationContext zu marshallen. Das BW macht das gleiche. –
Siehe Bearbeiten für Antwort. – Dun3