Как обновить графический интерфейс с помощью backgroundworker?

Я провел весь день, пытаясь заставить мое приложение использовать потоки, но безуспешно. Я прочитал много документации об этом, и я все еще получаю много ошибок, поэтому я надеюсь, что вы можете мне помочь.

У меня есть один большой трудоемкий метод, который вызывает базу данных и обновляет графический интерфейс. Это должно происходить постоянно (или примерно каждые 30 секунд).

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();
    }
}

При таком подходе я получаю исключение, потому что фоновый работник не является STA-потоком (но из того, что я могу понять, это то, что я должен использовать). Я попытался с потоком STA, и это дало другие ошибки.

Я думаю, что проблема в том, что я пытаюсь обновить графический интерфейс при выполнении вызова базы данных (в фоновом потоке). Я должен только делать вызов базы данных, а затем каким-то образом он должен переключиться обратно в основной поток. После выполнения основного потока он должен вернуться к фоновому потоку и так далее. Но я могу'не вижу, как это сделать.

Приложение должно обновить графический интерфейс сразу после вызова базы данных. Огненные события неКажется, не работает. Фоновая нить просто входит в них.

РЕДАКТИРОВАТЬ:

Некоторые действительно хорошие ответы :) Это новый код:}

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
}

Но как я могу делать это каждые 10 секунд? System.Threading.Thread.Sleep (10000) просто заставит мой GUI зависать, и цикл while (true) в Update (), как предлагается, дает исключение (поток слишком занят).

Ответы на вопрос(7)

Ваш ответ на вопрос