Invocar delegado en el hilo principal en la aplicación de consola

En una aplicación de Windows, cuando se usan múltiples hilos, sé que es necesario invocar el hilo principal para actualizar los componentes de la GUI. ¿Cómo se hace esto en una aplicación de consola?

Por ejemplo, tengo dos hilos, uno principal y otro secundario. El hilo secundario siempre está escuchando una tecla de acceso rápido global; Cuando se presiona, el subproceso secundario ejecuta un evento que llega al método win32 api AnimateWindow. Estoy recibiendo un error porque solo el hilo principal puede ejecutar dicha función.

¿Cómo puedo decirle efectivamente al hilo principal que ejecute ese método, cuando "Invocar" no está disponible?

actualizar: Si ayuda, aquí está el código. Para ver las cosas de HotKeyManager (donde entra en juego el otro hilo), mira la respuesta aesta pregunta

class Hud
{
    bool isHidden = false;
    int keyId;

    private static IntPtr windowHandle;

    public void Init(string[] args)
    {
        windowHandle = Process.GetCurrentProcess().MainWindowHandle;
        SetupHotkey();
        InitPowershell(args);
        Cleanup();
    }

    private void Cleanup()
    {
        HotKeyManager.UnregisterHotKey(keyId);
    }

    private void SetupHotkey()
    {

        keyId = HotKeyManager.RegisterHotKey(Keys.Oemtilde, KeyModifiers.Control);
        HotKeyManager.HotKeyPressed += new EventHandler<HotKeyEventArgs>(HotKeyManager_HotKeyPressed);
    }

    void HotKeyManager_HotKeyPressed(object sender, HotKeyEventArgs e)
    {
       ToggleWindow();
    }

    private void ToggleWindow()
    {
        //exception is thrown because a thread other than the one the console was created in is trying to call AnimateWindow

        if (isHidden)
        {
            if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_NEGATIVE | AnimateWindowFlags.AW_SLIDE))
                throw new Win32Exception(Marshal.GetLastWin32Error());
        }
        else
        {
            if (!User32.AnimateWindow(windowHandle, 200, AnimateWindowFlags.AW_VER_POSITIVE | AnimateWindowFlags.AW_HIDE))
                throw new Win32Exception(Marshal.GetLastWin32Error());
        }
        isHidden = !isHidden;
    }

    private void InitPowershell(string[] args)
    {
        var config = RunspaceConfiguration.Create();
        ConsoleShell.Start(config, "", "", args);
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta