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 leer 😞

    Mache 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 stattdessen Invoke oder rufe danach EndInvoke 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);
     }
    

Anmelden zum Antworten