Laden...

Cross-Thread DataBinding

Erstellt von impact vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.004 Views
I
impact Themenstarter:in
332 Beiträge seit 2004
vor 17 Jahren
Cross-Thread DataBinding

Hi Leute !

Windows.Forms dürfen nur aus dem Thread geändert werden in welchem sie erstellt wurden. So weit so gut.

Was passiert aber bei Windows.Forms DataBinding, wenn die gebundenen Daten aus einem anderen Thread heraus geändert werden ?

Beispiel:
Was ist mit einem DataGrid welches als DataSource eine DataTable besitzt ? Kann ja gut sein das die DataTable in einem anderen Thread geändert wird. Dann knallts....

Bitte um Hilfe !!

Gruß
Impact

M
104 Beiträge seit 2005
vor 17 Jahren

Original von impact
Kann ja gut sein das die DataTable in einem anderen Thread geändert wird. Dann knallts....

Der andere Thread wird ja nicht aus dem Nichts erstellt. Dies wirst Du ja hoffentlich selbst machen. Dann kannst/musst Du ja auch für die notwendige Synchronisierung sorgen.

Gruß
Morpheus

2.082 Beiträge seit 2005
vor 17 Jahren

Hallo impact,

such mal hier im Forum nach lock.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

I
impact Themenstarter:in
332 Beiträge seit 2004
vor 17 Jahren

@Morpheus:
Nein, leider nicht. Die DataTable erzeugt neue Einträge wenn Sie bestimmte Events empfängt. Leider werden eben diese Events in vielen unterschiedlichen Threads gefeuert, die an Stellen erzeugt werden für die kein Code existiert....

I
impact Themenstarter:in
332 Beiträge seit 2004
vor 17 Jahren

Kann man das Update des Controls eventuell abfangen, in den GUI-Thread "verpflanzen" und dann durchführen ?

M
104 Beiträge seit 2005
vor 17 Jahren

Original von impact
Die DataTable erzeugt neue Einträge wenn Sie bestimmte Events empfängt. Leider werden eben diese Events in vielen unterschiedlichen Threads gefeuert, die an Stellen erzeugt werden für die kein Code existiert....

Hallo impact,

mit diesen Infos lässt sich das Problem nun erheblich verkleinern. Wenn die DataTable "nur" auf Events reagiert und neue Datensätze erzeugt, dann ist das ja imho erstmal kein Multithreading-Problem, da es egal wer die Events feuert.

Du hast ja diese DataTable als DataSource für ein DataGrid (ziemlich viel Data 😉 ) eingetragen. Hier kannst Du auf die entsprechenden Events der DataTable reagieren (RowChanged, RowDeleted, etc.)

Falls Du allerdings mit "DataTable" eine Tabelle in einer Datenbank meinst, die auch von anderen Programmen geändert werden kann, und Du diese Änderungen in der DB immer aktuell in Deiner Anwendung anzeigen möchtest, kannst Du Dich ja noch einmal melden.

Gruß
Morpheus

I
impact Themenstarter:in
332 Beiträge seit 2004
vor 17 Jahren

Morgen ! =)

Die DataTable stammt nicht aus einer Datenbank, sondern wird tatsächlich nur durch die Events "gefüttert". Nur eins verstehe ich nicht: Warum ist es egal wer die Events feuert ?

Könnte ich das Problem also folgendemaßen lösen ?

  1. RowChanging - Event abfangen
  2. DataRowAction auf "Nothing" stellen damit nichts hinzugefügt wird
  3. DataRow Infos auslesen und zwischenspeichern
  4. In den GUI Thread wechseln (über Invoke)
  5. Die DataRow manuell hinzufügen

Grüße !

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo impact,

Teilantwort: Events laufen (wenn nichts spezielles programmiert ist) immer in dem Thread, der das Event auslöst.

herbivore