我创建了一个委托,我打算异步调用它。
模块级别
Delegate Sub GetPartListDataFromServer(ByVal dvOriginal As DataView, ByVal ProgramID As Integer)
Dim dlgGetPartList As GetPartListDataFromServer
我在一个方法中使用以下代码:
Dim dlgGetPartList As New GetPartListDataFromServer(AddressOf AsyncThreadMethod_GetPartListDataFromServer)
dlgGetPartList.BeginInvoke(ucboPart.DataSource, ucboProgram.Value, AddressOf AsyncCallback_GetPartListDataFromServer, Nothing)
该方法运行并执行其所需操作。
异步回调在完成后触发,我在其中执行EndInvoke操作。
Sub AsyncCallback_GetPartListDataFromServer(ByVal ar As IAsyncResult)
dlgGetPartList.EndInvoke(Nothing)
End Sub
只要调用委托的BeginInvoke方法的方法在没有BeginInvoke/Thread操作正在运行时运行,它就能正常工作。问题是,当委托上的另一个线程仍在运行且尚未EndInvoke时,可能会调用新线程。
如果需要,程序需要能够同时运行多个委托实例,并且它们都需要完成并调用EndInvoke。一旦我开始另一个BeginInvoke,我就失去了对第一个BeginInvoke的引用,因此无法使用EndInvoke清理新线程。
如何干净地解决这个问题并达到最佳实践?