线程化时,文本框不会更新

时间:2013-07-25 19:44:03

标签: multithreading textbox

以下是名为" 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中的任何文本。我是多线程的新手。之前我读过很多关于这个问题的答案,但没有一个能够展示出一个例子。你能帮忙吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

我根本不使用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

答案 2 :(得分:0)

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

起初看起来似乎令人生畏,但一旦掌握了它,它就成了第二天性。

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