加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:03:29 所属栏目:大数据 来源:网络整理
导读:我是VB.NET中多线程的新手,遇到了一个问题,我希望将文本附加到后台运行的服务线程的表单上的文本框中. 我正在开发的应用程序是一个客户端/服务器监听器,我已经能够让客户端和服务器PC相互通信(通过MsgBox确认),但是我现在正努力在服务器上获取服务线程以附加
我是VB.NET中多线程的新手,遇到了一个问题,我希望将文本附加到后台运行的服务线程的表单上的文本框中.

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

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

谁能确定我哪里出错了,并指出我正确的方向?

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

Dim outMessage As String = (encoder.GetString(message,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…

06000

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

InvokeRequired是Form的实例属性.但是testDebug是一个类名,而不是对testDebug类型的实例的引用.这在VB.NET中是可能的,已经让很多VB.NET程序员陷入了困境.这是从VB6延续出来的一个时代错误.当你在一个线程中执行此操作时,它会彻底崩溃并在你的脸上爆炸.您将获得表单的新实例,而不是用户正在查看的实例.一个不可见,因为它的Show()从未被调用过.因为线程没有运行消息循环,否则作为一个doornail死了.

我已经多次回答过这个问题了,建议修复.我会把你推荐给他们,而不是在这里重复一遍:

> Form is not updating,after custom class event is fired
> Accessing controls between forms

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读