Wie aktualisiere ich die GUI mit Backgroundworker?

Ich habe den ganzen Tag damit verbracht, meine Anwendung dazu zu bringen, Threads zu verwenden, aber ohne Glück. Ich habe viel Dokumentation darüber gelesen und ich bekomme immer noch viele Fehler, also hoffe ich, dass Sie mir helfen können.

Ich habe eine große zeitaufwendige Methode, die die Datenbank aufruft und die GUI aktualisiert. Dies muss die ganze Zeit geschehen (oder etwa alle 30 Sekunden).

public class UpdateController
{
    private UserController _userController;

    public UpdateController(LoginController loginController, UserController userController)
    {
        _userController = userController;
        loginController.LoginEvent += Update;
    }

    public void Update()
    {
        BackgroundWorker backgroundWorker = new BackgroundWorker();
        while(true)
        {
            backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
            backgroundWorker.RunWorkerAsync();
        }     
    }

    public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        _userController.UpdateUsersOnMap();
    }
}

Mit diesem Ansatz bekomme ich eine Ausnahme, weil der Backgroundworker kein STA-Thread ist (aber von dem, was ich verstehen kann, ist dies das, was ich verwenden sollte). Ich habe es mit einem STA-Thread versucht und das gab andere Fehler.

Ich denke, das Problem liegt daran, dass ich während des Datenbankaufrufs (im Hintergrundthread) versuche, die GUI zu aktualisieren. Ich sollte nur den Datenbankaufruf machen und dann sollte es irgendwie wieder zum Hauptthread wechseln. Nachdem der Haupt-Thread ausgeführt wurde, sollte er zum Hintergrund-Thread zurückkehren und so weiter. Aber ich kann nicht sehen, wie das geht.

Die Anwendung sollte die GUI direkt nach dem Datenbankaufruf aktualisieren. Feuerereignisse scheinen nicht zu funktionieren. Der Hintergrund-Thread tritt gerade in sie ein.

BEARBEITEN:

Einige wirklich gute Antworten :) Dies ist der neue Code:

public class UpdateController{
private UserController _userController;
private BackgroundWorker _backgroundWorker;

public UpdateController(LoginController loginController, UserController userController)
{
    _userController = userController;
    loginController.LoginEvent += Update;
    _backgroundWorker = new BackgroundWorker();
    _backgroundWorker.DoWork += backgroundWorker_DoWork;
    _backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
}

public void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    _userController.UpdateUsersOnMap();
}

public void Update()
{   
    _backgroundWorker.RunWorkerAsync();
}

void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //UI update
    System.Threading.Thread.Sleep(10000);
    Update();
}

public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // Big database task
}

}

Aber wie kann ich das alle 10 Sekunden machen? System.Threading.Thread.Sleep (10000) bewirkt, dass meine GUI einfriert, und die (True) -Schleife in Update () gibt, wie vorgeschlagen, eine Ausnahme aus (Thread zu beschäftigt).

Antworten auf die Frage(7)

Ihre Antwort auf die Frage