Laden...

Datenbindung langsam, wenn die Daten häufig aktualisiert werden

Erstellt von Bunnychecker vor 12 Jahren Letzter Beitrag vor 12 Jahren 926 Views
B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren
Datenbindung langsam, wenn die Daten häufig aktualisiert werden

Hi.

Ich habe eine Liste von Benutzerdaten, die ich in meinem DGV anzeigen möchte. Unter diesen Benutzerdaten befindet sich auch eine Spalte, die den aktuellen Status anzeigt. Dieser Status kann sich ständig ändern und der Intervall, dass sich dieser Status ändert liegt zwischen 0 und 60 Sekunden. Also bei ~100 User Einträgen kommt da ganz schön was zusammen.

Bisher habe ich über Events mein DGV angesteuert:

UserData data = new UserData();
//[...]
data.StatusChanged+=(sender, status) => row["status"]=status;

Nun habe ich meine Code so abgeändert, dass ich eine Datenbindung realisieren wollte:

BindingList<UserData> Data = new BindingList<UserData>();
dgv.DataSource=Data;

Nun ja, aber die Datenbindung ist so extrem langsam, dass ich nur schlecht aktualisierte Infos über den Status habe.

Was soll ich tun? Datanbindung wieder vergessen?

LG

F
10.010 Beiträge seit 2004
vor 12 Jahren

Und du benutzt auch INotifyPropertyChanged in deinem UserData?

Dein erster Code sieht eher so aus als wenn du da etwas versuchst nachzubauen, das es im FW schon seit .... gibt.

B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren

Und du benutzt auch INotifyPropertyChanged in deinem UserData?

Dein erster Code sieht eher so aus als wenn du da etwas versuchst nachzubauen, das es im FW schon seit .... gibt.

Okay, habe das jetzt implementiert.

Kann es sein, dass ich irgendwo noch einen Refresh für das DGV einbauen muss, weil die Anzeige im DGV sich z.B. ändert, wenn es den Fokus verliert und den Fokus wiederbekommt.

edit: ah ich glaube warum das so ist, weil meine Objekte in einzelnen Threads gestartet werden und somit das DGV nur schlecht aktualisert wird.

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo Bunnychecker,

ah ich glaube warum das so ist, weil meine Objekte in einzelnen Threads gestartet werden und somit das DGV nur schlecht aktualisert wird.

Das klingt verdächtig...
Hast du dir diese Links mal genau angeschaut? [FAQ] Warum blockiert mein GUI? bzw. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Wahrscheinlich ist da auch besser wenn nicht jeder User selbst in einem Thread nachschaut ob sich der Status ändert.
Verwende da wenn möglich erstens einen Timer oder zweitens einen Thread für alle User

Gruß
Michael

B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren

Wahrscheinlich ist da auch besser wenn nicht jeder User selbst in einem Thread nachschaut ob sich der Status ändert.
Verwende da wenn möglich erstens einen Timer oder zweitens einen Thread für alle User

Ich habe mir auch schon Gedanken gemacht, meine Objekte nicht jeweils in einem Thread laufen zu lassen, aber ich bin zu dem Entschluss gekommen, dass dies nicht möglich ist, da meine Objekte(User) nach einem ganz speziellen Ablauf (sequentiell) abgearbeitet werden müssen und auch entsprechend lange dauern. Ich packe daher jedes meiner Objekte in den ThreadPool.

Wo ich jetzt genau meinen Control.Invoke einbinden muss, ist mir noch unklar, da ich nur eine BindingList<User> habe, die ans DGV gebunden ist und eine StartButton, der für jeden User

ThreadPool.Queue...(Start/*Methode*/,User/*ÜbergabeParameter*/)

ausführt.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Bunnychecker,

die Änderungen an den direkt oder indirekt gebundenen Daten müssen im GUI-Thread erfolgen. Sonst kann es immer Probleme geben. Egal wo du danach versuchst noch ein Control.Invoke einzubauen (z.B. im NotifyPropertyChanged), ist der Zug schon abgefahren.

Natürlich musst du nicht für jede einzelne Änderung Control.Invoke aufrufen, sondern kannst erst mehrere Änderungen sammeln.

Aber das steht alles in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

herbivore