1

这是名为“Blahing”的模块内的子代码:

    Sub BlahBlah(ByVal Count As Long)
        For i As Long = 0 To Count
            frmBlaher.txtBlah.Appendtext("Blah")
        Next
    End Sub

这是名为 frmBlaher 的表单中的按钮单击事件代码:

     Private Sub WriteBlah_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles WriteBlah.Click
         Dim Thread As New Threading.Thread(Sub() Blahing.BlahBlah(Val(_
              TxtBlahCount.Text)))

         Thread.Start()
     End Sub

当我在 txtBlahCount 中输入任何数字(例如 10)然后按下 WriteBlah 按钮时,什么也没有发生。我设置了多个断点,我发现“Appendtext”部分出现但不起作用。我检查了 txtBlah 的 Text_Changed 事件,它发生了,但唯一的问题是,我在 txtBlah 中看不到任何文本。我是多线程的新手。我之前读过很多关于这个问题的答案,但没有一个给出一个例子。你能帮忙吗?

4

3 回答 3

2

运行你的代码有点不同,这就是 vb.net 中多线程的结构应该是什么样子(它与 Vb.net 没有将命名空间传递给我所理解的模型有关)

这将是您从 MainThread 加载的 startThread 或 w/e 有您

Private Sub DoSomethingSimple()
    Dim DoSomethingSimple_Thread As New Thread(AddressOf DoSimple)
    DoSomethingSimple_Thread.Priority = ThreadPriority.AboveNormal
    DoSomethingSimple_Thread.Start(Me)
End Sub

这将是实际的线程本身(新模型/类或同一类)

Private Sub DoSimple(beginform As Form)
    'Do whatever you are doing that has nothing to do with ui

    'For UI calls use the following
    SomethingInvoked(PassibleVariable, beginform)

End Sub

为每次调用主线程编写一个委托和调用方法。

Delegate Sub SomethingInvoked_Delegate(s As Integer, beginform As Form)
Sub SomethingInvoked_Invoke(ByVal s As Integer, beginform As Form)
    If beginform.NameOfControlYouAreUpdating.InvokeRequired Then ' change NameOfControlYouAreUpdating to the Name of Control on the form you wish to update
        Dim d As New SomethingInvoked_Delegate(AddressOf SomethingInvoked_Invoke)
        beginform.Invoke(d, New Object() {s, beginform})
    Else

        'Do something...
        beginform.NameOfControlYouAreUpdating.Condition = Parameter

    End If
End Sub

这是在 vb.net 中编写线程的测试(非挂起)方式

如果您需要进一步帮助将您的代码实施到此模板,请告诉我:P

于 2013-07-25T20:53:54.157 回答
1

这是因为您试图从创建它的线程以外的线程更新控件。您可以使用 Control.Invoke 和 Control.InvokeRequired 方法来解决这个问题。Control.Invoke 将在创建控件的线程上运行传入的委托。

我根本不使用 VB,但您可以尝试以下方法:

Delegate Sub BlahBlahDelegate(ByVal Count As Long)

Sub BlahBlah(ByVal Count As Long)
    If frmBlaher.txtBlah.InvokeRequired Then
        Dim Del As BlahBlahDelegate
        Del = new BlahBlahDelegate(AddressOf BlahBlah)
        frmBlaher.txtBlah.Invoke(Del, New Object() { Count })
    Else
        For i As Long = 0 To Count
            frmBlaher.txtBlah.AppendText("Blah")
        Next
    End If
End Sub
于 2013-07-25T20:07:02.403 回答
0

看看 MSDN 站点,它将为您提供所需的一切。您尤其需要注意 SetText 方法及其对 InvokeRequired 和 Invoke 方法的使用,以及它对委托的使用。

起初它可能看起来令人生畏,但一旦你掌握了它,它就会成为第二天性。

这是一个链接http://msdn.microsoft.com/en-us/library/ms171728(v=vs.80).aspx

于 2013-07-25T20:46:16.600 回答