Zugriff auf GUI Thread
-
Hallo,
ich versuche gerade an ein Datagrid eine List zu binden. Ich habe dafür eine BackgroundWorker-DoWork-Methode geschrieben, die eine Funktion zum Auslesen der Daten aus der DB aufruft. Für den Funktionsaufruf benötige ich Texteingaben aus der GUI.
Ich habe zunächst die Fehlermeldung erhalten, dass ich aus einem anderen Thread heraus nicht auf die GUI-Elemente zugreifen darf. Verwende ich nun einen
einen Dispatcher mit der BeginInvoke und schreibe den Inhalt in eine Klassenvariable (hier: this.a), dann ist diese Variable beim Aufruf der Funktion irgendwie wieder leerMache ich hier etwas grundlegendes falsch?
void worker_DoWork(object sender, DoWorkEventArgs e){ txtA.Dispatcher.BeginInvoke( (Action)(() => { this.a=txtA.Text; } )); this.result = getDataAsList(this.a); }
-
BeginInvoke
muss nicht notwendigerweise sofort ausgeführt werden.(Das sagt auch der Prefix
Begin
- Nimm stattdessenInvoke
oder rufe danachEndInvoke
mit dem entsprechenden Token auf)
-
Hallo,
vielen Dank für deine Antwort. Ich habe es mittlerweile anderes gelöst:
ich lese die Daten aus bevor ich den BackgroundWorker nutze und übergebe diese dann der RunWorkerAsync-Methode des BackgroundWorkers. Die Daten erhalte ich in der DoWork-Methode über den EventArgs Parameter
private void btnSearch_Click(object sender, EventArgs e){ var daten= new MyClass(){ a= txtA.Text}; worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); worker.RunWorkerAsync(daten); } void worker_DoWork(object sender, DoWorkEventArgs e) { var daten=e.Argument; this.result = getDataAsList(daten.a); }