13,190
社区成员




Public Class Form1
'这就是那个新写的类,为了看起来方便就放在这里了。
Public Class OtherThread
'定义好一个事件,来跟别的类打交道
Public Event TextChanged(ByVal vstrText As String)
'今后生成的实例就用这个名字来区别一下
Private _name As String = ""
'建立一个新线程,其实也就是本来在主窗体代码中的生成新线程的处理。
Public Sub DoSomethingInNewThread()
Dim p As New Threading.Thread(AddressOf DoSomething)
p.Start() '需要找个时机销毁它
End Sub
'这个函数用来模拟那个拖慢主线程窗体的处理
Public Sub DoSomething()
For i As Integer = 0 To 10
Threading.Thread.Sleep(100)
'TextBox1.AppendText(_name & i) '当这个函数还在主线程里面时候,这样就可以操作窗体上的控件了。可惜放在新线程里面就不行了。
RaiseEvent TextChanged(_name & i) '现在放到新的类里面了,就更看不到控件了,所需要做的就是:我发出了一个事件,别的类愿意怎么处理就怎么处理吧。
Next
End Sub
Public Sub New(ByVal vstrName As String)
_name = vstrName
End Sub
End Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'生成两个新类的实例
Dim a As New OtherThread("a")
Dim b As New OtherThread("b")
'用来捕获实例发出的事件
AddHandler a.TextChanged, AddressOf OtherThread_TextChanged
AddHandler b.TextChanged, AddressOf OtherThread_TextChanged
'这个调用是用来演示DoSomething()里面的处理会拖慢窗体。
a.DoSomething()
b.DoSomething()
'DoSomethingInNewThread()里面用了新线程,就不会拖慢窗体了。
a.DoSomethingInNewThread()
b.DoSomethingInNewThread()
'DoSomethingInNewThread()里面是新线程,执行到这里的时候,实例a和实例b里面的新线程还在运行中,因此不能在这里RemoveHandler ,
'RemoveHandler a.TextChanged, AddressOf OtherThread_TextChanged
'RemoveHandler b.TextChanged, AddressOf OtherThread_TextChanged
End Sub
Private Sub OtherThread_TextChanged(ByVal vstrText As String)
'让OtherThread这个类负责处理繁重的工作,主线程就负责显示好了。
TextBox1.AppendText(vstrText & vbCrLf)
End Sub
End Class
Private Delegate Sub ShowTextDelegate(ByVal vstrText As String)
Private Sub ShowText(ByVal vstrText As String)
TextBox1.AppendText(vstrText & vbCrLf)
End Sub
Private Sub OtherThread_TextChanged(ByVal vstrText As String)
'让OtherThread这个类负责处理繁重的工作,主线程就负责显示好了。
If InvokeRequired Then
Invoke(New ShowTextDelegate(AddressOf ShowText), vstrText )
Else
ShowText(vstrText )
End If
End Sub