Laden...

Multithreading: Für Änderungen von datengebundener Datatable den GUI-Thread invoken?

Erstellt von Cornflake vor 11 Jahren Letzter Beitrag vor 11 Jahren 605 Views
Thema geschlossen
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 11 Jahren
Multithreading: Für Änderungen von datengebundener Datatable den GUI-Thread invoken?

Hallo

Müssen DataTables wie Controls invoked werden oder zurückgegeben werden?

Ich habe folgenden Aufbau... (Alles in C# 3.0 geschrieben, )

GUI Klasse:
Erzeugt eine Dataset Instanz mit mehreren Tabellen.
Zeig den Inhalt de Tabellen in einer Datagridview über eine BindingSource an.
Ruft eine DataTable_Refresh_Thread Klasse auf mit Übergabe einer Datatable und eines Datagridviewers als Ref
++
DataTable_Refresh_Thread Klasse:++
Nimmt im Konstruktor per Ref eine DataTable und ein DataGridView entgegen.
Erzeugt einen Thread dem die DataTable weitergereicht wird und der die DataTable füllt
Abonniert einen Fertig() Event des anderen Threads, um bei eintreten das DataGridView zu Refreshen.
Startet in dem anderen Thread die ThreadRunnerMethode
Wartet 2Sek und erzeugt wieder ein Thread der die DataTable füllt.

DataTable_Refresh_Threadworker Klasse:
Nimmt als Eigenschaft die Ref auf die DataTable entgegen.
Die ThreadRunnerMethode füllt die (DataTable

Wenn dieThreadRunnerMethode fertig ist raised sie den Fertig Event.

Die oben beschriebene DataTable_Refresh_Thread Klasse funktioniert bisher in dem genannten Aufbau.
Allerdings habe ich die DataTable_Refresh_Thread Klasse in einem erweiterten Aufbau für RAPI Unterstützung nochmal.
In dieser Version wird auch (per Debugger getestet) die DataTable in dem anderen Thread gefüllt, aber irgendwie sind nach beenden dieses Threads dann die Daten weg bzw. die DataTable wieder leer.

Daher die Frage, hätte ich die Referenz der gefüllten DataTable wieder zurückgeben oder Invoken oder irgendwie ein DataTableSaveChanges aufrufen müssen ?(

Was mich wundert. In der Klasse ohne Rapi wird die übergebe Tabelle nach gleichem Schema gefüllt und das Ergebnis wird auch ohne Meldungen sauber angezeigt.
Nur in der Klasse die für das Sammeln der Daten RAPI nutzt, sind dann nach dem Füllen und verlassen des Threads keine Daten zu sehen. Läuft aber auch ohne Fehlermeldung.

Vielleicht weiß einer von euch welche Objekte invoked werden müssen, oder ob veränderte Referenzen wieder zurückgegeben werden müssen. ?(

Grüße Cornflake

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Cornflake,

Zugriffe auf gebundene Daten müssen - genau wie Zugriffe auf die Controls selbst - aus dem GUI-Thread erfolgen. Das und alles weitere Wissenswerte kannst du der FAQ entnehmen: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

Zu dem anderen angerissenen Problem: Natürlich musst du sicherstellen, dass du mit der richtigen DataTable arbeitest. Das hat aber nichts speziell mit der DateTable zu tun, sondern man muss grundsätzlich darauf achten, mit den richtigen Objekten zu arbeiten. Dasselbe ist eben etwas anderes als das gleiche.

herbivore

Thema geschlossen