【问题标题】:Multi-Thread (Append Text To TextBox)多线程(将文本附加到文本框)
【发布时间】:2021-02-15 05:56:33
【问题描述】:

尽我所能查找此内容,但它没有任何意义..

我知道我们必须使用委托来更新主 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

问题??永远不需要调用,并且新消息永远不会附加到我需要附加到的文本框中。

代表:

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

【问题讨论】:

  • 不再需要定义自己的委托。 ActionFunc 委托可用于分别调用 SubsFunctions,参数为 0 到 16 个。在您的情况下,您将使用 Action(Of TextBox, String)
  • 嗨,Jimmy,即使将代码从 Form1 移动到其本地 Form5 现在可以正常工作。我对你的方法很感兴趣。如何使用 Action 将此文本附加到我的 TextBox2?
  • 您只需摆脱您的AddToMessageBoxDelegate 代表并改用Action(Of TextBox, String)。其他一切都一样。

标签: vb.net multithreading


【解决方案1】:

问题是你在这里使用了表单的默认实例:

SetTextBoxWithInvoke(Form5.TextBox2, MESSAGE)

默认实例是线程特定的,因此,如果您在后台线程上执行该代码,而不是使用在 UI 线程上创建并显示的现有 Form5 实例,它将在当前线程上创建一个新实例.无需调用委托来访问该实例,因此 InvokeRequired 始终为 False

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

如果代码还没有在表单中,那么也许你根本不应该这样做。相反,您可以使用 SynchronizationContext 类。当您的对象在 UI 线程上创建时,您将获得当前实例,然后您可以调用其 SendPost 方法来封送回 UI 线程,而无需显式的 Control 引用。不过,这可能不适用于您的情况,因为您仍然需要引用正确的 TextBox

【讨论】:

  • 我喜欢你的回答,但你失去了我。我知道我正在创建一个新的 form5 实例。我不明白的是如何告诉代码将信息发送到我希望它到达的 Form5.Textbox2?
  • @StavrosPehlivanidis,您的第二个 sn-p 中的代码在哪里?
  • 我实际上是通过将代码表单 Form1 移动到 Form5 并调用 Me.Textbox2 方法来使其工作的。非常感谢!
  • 在我走之前。关于如何使用调用方法附加到我的文本框的任何想法?
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2020-03-12
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2012-07-21
  • 1970-01-01
相关资源
最近更新 更多