Autor Beitrag
Peugeot1220
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 02.02.09 19:51 
Hi,

ich kämpf da schon seit Tagen mit einem Backgroundworker Problem. Vielleicht könnt ihr mir da weiterhelfen.
Ich habe einen Backgroundworker, der eine Klasse instanziert und eine Methode daraus aufruft:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
protected override void OnDoWork(DoWorkEventArgs e)
{
CheckSomething cs = new CheckSomething();
cs.Check(e.Argument);
}


Das Problem ist, das ich die Ergebnisse aus cs.Check aus dem OnDoWork in ein Datagridview rein schreibe, jedoch die Werte überhaupt nicht zusammmen passen, weil sie mit den anderen Threads total durcheinander kommen.
Was mach ich falsch?

Die cs.Check Klasse beinhaltet ein webrequest der einen Servicepointer auslöst. Ergebnisse aus dem Webrequest und dem Servicepointer werden dann zurück an OnDoWork geliefert.

Ich hoffe ich war einigermaßen verständlich und ihr könnt mir weiterhelfen.

patrick

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 02.02.2009 um 18:59
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 02.02.09 20:18 
user profile iconPeugeot1220 hat folgendes geschrieben:
Das Problem ist, das ich die Ergebnisse aus cs.Check aus dem OnDoWork in ein Datagridview rein schreibe, jedoch die Werte überhaupt nicht zusammmen passen, weil sie mit den anderen Threads total durcheinander kommen.
Was mach ich falsch?

Es fehlen noch Angaben zu den übrigen Bestandteilen des BackgroundWorker. Falsch ist auf jeden Fall Folgendes:
  • Es gehört sich nicht, Daten direkt in ein DataGridView zu schreiben. Daten gehören in eine Datenmenge, z.B. DataTable, und diese wird an das DataGridView gebunden.
  • Wenn das so gemacht wird, beißt sich das normalerweise nicht mit dem GUI-Thread (vorausgesetzt natürlich, dass die einzelnen Zeilen sich nicht beißen).
  • Wenn Du eine laufende Anzeige haben willst, muss die durch einen manuellen Aufruf von worker.ReportProgress() aktiviert werden.

Siehe das Beispiel in der SDK-Doku/MSDN zur BackgroundWorker-Klasse.

Gruß Jürgen