【问题标题】:Update GUI from another class in vb.net从 vb.net 中的另一个类更新 GUI
【发布时间】:2015-05-01 04:03:56
【问题描述】:

我正在为在 Tcp 和 Sockets 上运行的聊天构建服务器和客户端,我希望客户端处理多个连接(到服务器),所以我创建了一个名为“客户端”的类来管理异步连接,这样我就可以同时运行更多实例,例如:

Dim ConnectionToServer1 as new Client
Dim ConnectionToServer2 as new Client

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

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

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

【问题讨论】:

    标签: vb.net multithreading tcp client server


    【解决方案1】:

    听起来你走的都是正确的道路。

    现在,在线程应用程序中,您将面临的挑战之一是您可以拥有大量工作线程,但只有主 UI 线程才能真正对 UI 进行任何更新。因此请记住,如果您有需要更新 ui 的异步代码,您将需要使用有效的委托。

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

    【讨论】:

    • 非常感谢您抽出宝贵时间!
    • 没问题。如果我的回答帮助您解决了您的问题,请将其标记为已接受,以便将来的搜索者知道这很有用。
    【解决方案2】:

    将此全局属性设置为 false

    Control.CheckForIllegalCrossThreadCalls = false
    

    这将允许您从任何线程编辑表单的任何控件

    【讨论】:

    • 不要这样做!!!这是 100% 一种糟糕的、错误的尝试处理此问题的方法。它只会禁用其他警告异常,而不是根本问题。
    • @Tim ,你能解释一下什么样的问题吗?
    • 间歇性崩溃、挂起、蓝屏。不保证稳定性。该选项存在的唯一原因是允许临时调试问题,它不适用于生产代码。 msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多