¿Cómo actualizar GUI con backgroundworker?

He pasado todo el día tratando de hacer que mi aplicación use subprocesos pero sin suerte. He leído mucha documentación al respecto y todavía recibo muchos errores, así que espero que puedan ayudarme.

Tengo un método que consume mucho tiempo y que llama a la base de datos y actualiza la GUI. Esto tiene que suceder todo el tiempo (o aproximadamente cada 30 segundos).

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

Con este enfoque obtengo una excepción porque el trabajador de fondo no es un subproceso STA (pero por lo que puedo entender, esto es lo que debo usar). He intentado con un hilo STA y que dio otros errores.

Creo que el problema se debe a que trato de actualizar la GUI mientras hago la llamada a la base de datos (en el hilo de fondo). Solo debería estar haciendo la llamada a la base de datos y luego, de alguna manera, debería volver al hilo principal. Después de que el hilo principal se haya ejecutado, debe volver al hilo de fondo y así sucesivamente. Pero no puedo ver cómo hacer eso.

La aplicación debe actualizar la GUI inmediatamente después de la llamada a la base de datos. Los eventos de fuego no parecen funcionar. El hilo de fondo acaba de entrar en ellos.

EDITAR:

Algunas respuestas realmente geniales :) Este es el nuevo código:

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
}

}

Pero, ¿cómo puedo hacer esto correr cada 10 segundos? System.Threading.Thread.Sleep (10000) simplemente congelará mi GUI y el ciclo (verdadero) en Actualización () como se sugiere da una excepción (Thread demasiado ocupado).

Respuestas a la pregunta(7)

Su respuesta a la pregunta