vb.net – 从工作线程更新UI表单
我是VB.NET中多线程的新手,遇到了一个问题,我希望将文本附加到后台运行的服务线程的表单上的文本框中.
我正在开发的应用程序是一个客户端/服务器监听器,我已经能够让客户端和服务器PC相互通信(通过MsgBox确认),但是我现在正努力在服务器上获取服务线程以附加文本到文本框,没有任何可变的发生. 我有一个名为testDebug的表单,它调用一个类(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 感谢你的协助. 马特
这是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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |