一尘不染

C#Windows窗体应用程序-从另一个线程和类更新GUI?

c#

我已经搜寻了很多,但似乎找不到与我的特定问题有关的任何内容。

我希望能够从另一个类(SocketListener)更新MainUI表单,并且在其中有一个处理网络的线程(clientThread)。现在,我可以运行来自网络线程的简单输出,例如写入调试器输出和创建MessageBox。

但是我真正想做的是能够从clientThread调用代码,该代码将在MainUI实例上执行操作。我怎样才能做到这一点?

另外,如果有人想要代码的特定部分,那么我可以将其发布以帮助您更好地理解我的要求。

最好的祝福!


阅读 339

收藏
2020-05-19

共1个答案

一尘不染

检查InvokeRequired中的Control类,并且如果这是真的,然后调用Invoke和传递,你想要给客户端的线程上做一个委托(通常是匿名方法)。

例:

public void DoWork(Form form)
{
    if (form.InvokeRequired)
    {
        // We're on a thread other than the GUI thread
        form.Invoke(new MethodInvoker(() => DoWork(form)));
        return;
    }

    // Do what you need to do to the form here
    form.Text = "Foo";
}
2020-05-19