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)
メソッドが実行され、必要なことを行います
Asyn コールバックは、EndInvoke を実行する完了時に発生します
Sub AsyncCallback_GetPartListDataFromServer(ByVal ar As IAsyncResult)
dlgGetPartList.EndInvoke(Nothing)
End Sub
これは、デリゲートで BeginInvoke を開始するメソッドが、BeginInvoke/Thread 操作がまだ実行されていないときにのみ実行される限り機能します。問題は、デリゲートの別のスレッドがまだ実行中で、まだ EndInvoke されていないときに、新しいスレッドが呼び出される可能性があることです。
プログラムは、必要に応じて一度に複数のインスタンスでデリゲートを実行できる必要があり、それらすべてが完了して EndInvoke が呼び出される必要があります。別の BeginInvoke を開始すると、最初の BeginInvoke への参照が失われるため、EndInvoke で新しいスレッドをクリーンアップできません。
この問題を解決するためのクリーンなソリューションとベスト プラクティスは何ですか?