我知道不能从不同的线程使用 GUI 组件。所以你通常会做一个检查 InvokeRequired 的方法,然后调用 Invoke 等。但这是很多代码。有没有办法做这样的事情:MyEvent += myDelegate 和这个 myDelegate 将从分配它的线程执行?
为什么 Invoke 方法只能在 Control 类中使用?我唯一的想法是制作自己的方法,如 AddDelegate (delegate.. , Control c) 或类似的东西。

知道如何实现这一目标吗?

最佳答案

为了避免这种重复的代码,我通常会创建一个类来隔离这个逻辑。当应用程序启动时,我初始化这个类并在整个应用程序中使用它。优点是它可以在控件之外使用。

public static class UI
{
    private static Control internalControl;

    public static void Initialize(Control control)
    {
        internalControl = control;
    }

    public static void Invoke(Action action)
    {
        if (internalControl.InvokeRequired)
        {
            internalControl.Invoke(action);
        }
        else
        {
            action();
        }
    }
}

初始化主窗体时初始化:
UI.Initialize(this);

用法:
UI.Invoke(() => { this.Text = "Test"; });

关于c# - WinForms GUI 控件的线程安全事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11916810/

10-13 08:00