Я создал делегата, которого я собираюсь вызвать Async.
Уровень модуля
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'd.
Программа должна иметь возможность запускать делегат более чем в одном экземпляре за раз, если необходимо, и все они должны завершиться и вызвать EndInvoke. После запуска другого BeginInvoke я теряю ссылку на первый BeginInvoke, поэтому не могу очистить новый поток с помощью EndInvoke.
Что такое чистое решение и лучшая практика для преодоления этой проблемы?