我正在开发的应用程序是一个客户端/服务器监听器,我已经能够让客户端和服务器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