之前写过一篇使用托管的方式实现多线程。今天再介绍一种方法,可以使用事件来达到目的。
首先,你需要两个类。一个自定义类,一个是主线程所在的类。
首先,是自定义类:
Public Class Wrench '新建一个事件 Public Event DoneLoading(ByVal Param As String) '如果在多线程中需要传递参数,可以使用类的属性 Private _PARAM As String Public Property Param As String Get Return _PARAM End Get Set(value As String) _PARAM = value End Set End Property '接下类这个方法是在新线程里执行的 Public Sub Loading() '这个变量相当于新线程的返回值 Dim RTN As String = "" '触发事件 RaiseEvent DoneLoading(RTN) End Sub '类的构造函数省略... End Class
接下来,在主线程里:
'全局声明自定义类为可接受事件 Private WithEvents OmniWrench As New Wrench '这个方法用于启动线程 Sub Main() '新建线程 Dim thNew As New System.Threading.Thread(AddressOf OmniWrench.Loading) '使用属性传递参数 OmniWrench.Param = "ABC" '启动线程 thNew.Start() End Sub '这个方法用于处理线程执行完触发的事件。形参strParam即为线程返回的值。 Public Sub DoneLoadingHandler(ByVal strParam As String) Handles OmniWrench.DoneLoading '使用Lambda表达式新建一个委托,以进行UI更改。 Me.Dispatcher.Invoke(New Action(Sub() '这里的语句可以直接操控UI。当然也可以不新建这个委托,也就不能对UI进行更改了。 End Sub)) End Sub