从vb.net中的另一个类更新GUI

时间:2015-02-28 13:11:38

标签: vb.net multithreading tcp client server

我为在Tcp和Sockets上运行的聊天构建服务器和客户端,我希望客户端处理多个连接(到服务器),所以我创建了一个名为&#34的客户端;客户端&# 34;管理异步连接,以便我可以同时运行更多实例,如:

Dim ConnectionToServer1 as new Client
Dim ConnectionToServer2 as new Client

因为当"连接"它是异步的。收到一条消息,它会生成一个事件(AsyncCallback),我可以将收到的字节转换为字符串。

问题是:我试图在Client类中将此字符串设置为我的Form上的RichTextBox,但没有任何反应,我试图在表单代码中创建一个委托但没有任何作用,我能够将收到的消息放在RichTextBox中的唯一方法是在Client类中创建一个名为LastMessage的公共变量,其中存储最后一条消息(每次收到消息时,sub会覆盖该字符串),然后运行由Form创建的线程,它继续检查数据(因为线程是由表单创建的,它可以访问控件,包括RichTextBox,对吧?) 虽然我发现这有点笨拙,有没有其他方式(通过代表?)我可以做到吗?

这里有一些代码: 客户类:http://pastebin.com/GF9um8Ss 表格代码:http://pastebin.com/xW7mDj8j

2 个答案:

答案 0 :(得分:2)

听起来你开始走所有正确的道路。

现在,在线程应用程序上,您将遇到的挑战之一是您可以拥有大量的工作线程,但只有主要的UI线程才能实际对UI进行任何更新。因此,请记住,如果您有需要更新ui的异步代码,则需要使用实际上是委托的内容。

你现在可以使用任务更轻松地执行此操作,所以请阅读任务并行库,但基本上你需要一个封送的委托/任务,以便在ui线程上运行来处理UI更新。

答案 1 :(得分:-1)

将此全局属性设置为false

Control.CheckForIllegalCrossThreadCalls = false

这将允许您从任何线程

编辑表单的任何控件