我已经搜索了很多,但好像找不到与我的具体问题相关的任何内容。
我想能够从另一个类(SocketListener)更新我的MainUI表单,在其中我有一个处理网络的线程(clientThread)。目前,我可以从网络线程运行简单的输出,例如写入调试器输出并创建MessageBox。
但是我真正想做的是能够调用来自clientThread的代码,在我的MainUI实例上执行操作。我该怎么做呢?
此外,如果有人想要特定部分的代码,那么我可以发布它以帮助您更好地理解我的问题。
最好的问候!
我已经搜索了很多,但好像找不到与我的具体问题相关的任何内容。
我想能够从另一个类(SocketListener)更新我的MainUI表单,在其中我有一个处理网络的线程(clientThread)。目前,我可以从网络线程运行简单的输出,例如写入调试器输出并创建MessageBox。
但是我真正想做的是能够调用来自clientThread的代码,在我的MainUI实例上执行操作。我该怎么做呢?
此外,如果有人想要特定部分的代码,那么我可以发布它以帮助您更好地理解我的问题。
最好的问候!
检查Control
类的InvokeRequired
,如果为真,则调用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";
}
class NetworkEventArgs : EventArgs { /* defined class here */ }
private void NetworkEventHandler(object sender, NetworkEventArgs e)
{
Invoke( ( MethodInvoker ) delegate {
myTextBox.Text = e.Message;
}
}
我基于这篇博客文章(链接)。我从未遇到过问题,所以我认为没有必要在代码中增加对InvokeRequired
属性的递归检查,以免让代码变得复杂。
你可以在clientThread类中定义一个事件
并在mainform中处理它,当clientThread需要让mainform执行某些操作(例如更新某些控件状态)时,你应该触发该事件
这样,mainform就可以从事件中获取参数并调用更新函数
Form
为参数的构造函数,然后将引用存储在类级变量中。 - MusiGenesis