Vb.net 多线程(将文本附加到文本框)

Vb.net 多线程(将文本附加到文本框),vb.net,multithreading,Vb.net,Multithreading,我尽了我最大的努力,但这毫无意义 我知道我们必须使用代理来更新主UI上的文本框 简而言之,下面是代码: 启动将捕获聊天的线程: ChatQuery = New Thread(AddressOf FetchChats) ChatQuery.Start() FetchChats代码简化: SetTextBoxWithInvoke(Form5.TextBox2, MESSAGE) SetTextBoxWithInvokeCode: Private Sub SetTextBoxWithInvoke(

我尽了我最大的努力,但这毫无意义

我知道我们必须使用代理来更新主UI上的文本框

简而言之,下面是代码:

启动将捕获聊天的线程:

ChatQuery = New Thread(AddressOf FetchChats)
ChatQuery.Start()
FetchChats代码简化:

SetTextBoxWithInvoke(Form5.TextBox2, MESSAGE)
SetTextBoxWithInvokeCode:

Private Sub SetTextBoxWithInvoke(ByVal TB As TextBox, ByVal msg As String)
        If TB.InvokeRequired Then
            TB.Invoke(New AddToMessageBoxDelegate(AddressOf SetTextBoxWithInvoke), New Object() {TB, msg})
        Else
            TB.Text &= msg
        End If
    End Sub
问题是什么??Invoke从来都不是必需的,新消息也从来不会附加到我需要附加到的文本框中

代表:

Public Delegate Sub AddToMessageBoxDelegate(ByVal TB As TextBox, ByVal msg As String)

问题是您在此处使用的是表单的默认实例:

SetTextBoxWithInvoke(Form5.TextBox2,消息)
默认实例是特定于线程的,因此,如果您在后台线程上执行该代码,而不是使用UI线程上创建和显示的现有
Form5
实例,它将在当前线程上创建新实例。无需调用委托来访问该实例,因此
invokererequired
始终为
False

您需要使用已经存在的
Form5
的实际实例。具体怎么做取决于具体情况。如果发出调用的代码已经是这种形式,那么只需使用
Me
,如果您没有明确使用另一个引用,这是隐含的。否则,将由您将所需的引用获取到要使用的所需对象中


如果代码还没有在表单中,那么您可能根本不应该这样做。相反,您可以使用
SynchronizationContext
类。当在UI线程上创建对象时,您将获得当前实例,然后可以调用其
Send
Post
方法来封送回UI线程,而无需显式的
控件
引用。但是,这在您的情况下可能不起作用,因为您仍然需要对正确的
文本框的引用

,不再需要定义您自己的委托。
操作
Func
委托可分别用于调用
Subs
函数
,参数从零到16。在您的情况下,您将使用
操作(文本框、字符串)
。您好,吉米,即使将代码从Form1移动到其本地Form5现在仍然有效。我对你的方法感兴趣。如何使用Action将此文本添加到我的TextBox2中?您只需去掉
AddToMessageBoxDelegate
委托,使用
操作(文本框,字符串)
。其他一切都一样。我喜欢你的答案,但你失去了我。我知道我正在创建form5的一个新实例。我不明白的是如何告诉代码将信息发送到我想要的Form5.Textbox2?@StavrosPehlivanidis,你的第二个代码片段中的代码在哪里?我实际上是通过将代码表单Form1移动到Form5并调用Me.Textbox2方法来实现的。非常感谢你!在我走之前。你知道如何用invoke方法附加到我的文本框吗?