我知道不能从不同的线程使用 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/