vb.net - 从工作线程更新 UI 表单

标签 vb.net

我是 VB.NET 中的多线程新手,并且遇到了一个问题,即我想要从后台运行的服务线程将文本附加到表单上的文本框。

我正在开发的应用程序是一个客户端/服务器监听器,我已经能够让客户端和服务器 PC 相互通信(通过 MsgBox 确认),但是我现在正在努力获取服务器上的服务线程将文本附加到文本框,没有任何可见的发生。

我有一个名为 testDebug 的表单,它调用一个类 (RemoteSupport),该类执行所有握手任务并使用连接数据更新文本框。

任何人都可以找出我出错的地方并指出正确的方向吗?

以下是我的代码: 该表单有一个名为txtOutput的文本框,以下内容来自remoteSupport类

Dim outMessage As String = (encoder.GetString(message, 0, bytesRead))
 MsgBox(outMessage, MsgBoxStyle.Information, "MEssage Received")
  If outMessage IsNot Nothing Then
    If testDebug.InvokeRequired Then
        ' have the UI thread call this method for us
        testDebug.Invoke(New UpdateUIDelegate(AddressOf HandleClientComm), New Object() {outMessage})    '
    Else
       testDebug.txtOutput.AppendText(outMessage)
    End If

    'RaiseEvent MessageReceived(outMessage) // a previous attempt to use custom events
 End If

我不确定调用方法是否是理想的解决方案,或者自定义事件是否是理想的解决方案,我花了一些时间尝试让自定义事件起作用,但这些也不起作用。

 // In the RemoteSupport class
 Public Delegate Sub MessageReceivedHandler(ByVal message As String)
 Public Shared Event MessageReceived As MessageReceivedHandler

// Located throughout the RemoteSupport class where debug information is required.
RaiseEvent MessageReceived(outMessage)

// Located in the code-behind of the form
Private Sub Message_Received(ByVal message As String)
testDebugOutput(message) // this is a function I have created 
                         // to append the text to the text box
End Sub

提供的代码已被删除,因此如果您想查看其他内容或有任何问题,请告诉我。

感谢您的帮助。

编辑:我已将两个 VB 文件(表单和类)上传到我的网站,如果有人可以查看它以帮助我识别 UI 未更新的问题,我将不胜感激。

我尝试了其他一些方法,但一旦工作线程启动,似乎没有任何东西可以更新 UI。

表格:mulholland.it/testDebug.vb.txt 类:mulholland.it/remoteSupport.vb.txt

感谢您的帮助。

马特

最佳答案

I have a form named testDebug...

If testDebug.InvokeRequired Then

这是 VB.NET 编程中的一个经典陷阱。在 If 语句上设置断点。请注意它如何返回 False,即使您知道代码正在另一个线程上运行?

InvokeRequired 是表单的实例属性。但 testDebug 是一个类名,而不是对 testDebug 类型的表单实例的引用。这在 VB.NET 中是可能的,这让许多 VB.NET 程序员陷入了深深的麻烦。这是从 VB6 遗留下来的一个时代错误。当你在线程中执行此操作时,它会完全崩溃并在你的脸上爆炸。您将获得表单的一个实例,而不是用户正在查看的实例。一个不可见的,因为它的 Show() 从未被调用过。否则就死定了,因为线程没有运行消息循环。

我已经多次回答过这个问题,并给出了建议的修复方法。我只是向您推荐它们,而不是在这里重复它:

关于vb.net - 从工作线程更新 UI 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980130/

相关文章:

VB.NET 将 USB 转换为 RS232

c# - 如何在调试时刷新 Excel

vb.net - 对于每个循环迭代计数

html - 传递参数并引用#div

.net - 如何以最佳方式合并 LINQ-to-SQL 查询

vb.net - 更改处理鼠标事件的顺序

vb.net - WithEvents/Handles 比 Remove/AddHandler 更好?

.net - 使用 LINQ 将数组数组组合成单个不同的数组

vb.net - Ultragrid 列中的日期时间格式

.net - 如何让我的 TCP 监听器服务正确终止?