Delegierter im Hauptthread der Konsolenanwendung aufrufen

Wenn in einer Windows-Anwendung mehrere Threads verwendet werden, muss der Haupt-Thread aufgerufen werden, um die GUI-Komponenten zu aktualisieren. Wie erfolgt dies in einer Konsolenanwendung?

Zum Beispiel habe ich zwei Threads, einen Haupt- und einen Nebenthread. Der sekundäre Thread wartet immer auf einen globalen Hotkey. Wenn es gedrückt wird, führt der sekundäre Thread ein Ereignis aus, das die win32-API-Methode AnimateWindow erreicht. Ich erhalte einen Fehler, weil nur der Haupt-Thread diese Funktion ausführen darf.

Wie kann ich den Haupt-Thread effektiv anweisen, diese Methode auszuführen, wenn "Invoke" nicht verfügbar ist?

aktualisieren Wenn es hilft, hier ist der Code. Lesen Sie die Antwort auf @, um die HotKeyManager-Inhalte zu sehen (wo der andere Thread ins Spiel kommtdiese Frag

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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage