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