BackgroundWorker を組み込んだいくつかの異なるクラスを作成しました。私が一般的に行っているのは、ジョブが実行されているときに開くフォームに BackgroundWorker コンポーネントを配置し、そのインスタンスをジョブ クラスのコンストラクターに渡すことです。
ジョブクラスは次のようになります。
Private m_bwMain As BackgroundWorker
Public Sub New(ByVal bwMain As BackgroundWorker)
m_bwMain = bwMain
'additional setup code here
End Sub
ジョブを開始するには、[ダウンロードの開始] ボタンの Click イベント ハンドラーで次のようにします。
lblStatus.Text = "Initializing ..."
bgwMain.RunWorkerAsync(someFileName)
ジョブ クラスを現在のフォームのプライベート メンバーとして宣言し、BackgroundWorker.DoWork イベントでインスタンス化します。そこから、メソッドを呼び出してファイルをダウンロードできます。
Private Sub bgwMain_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwMain.DoWork
m_oJobEngine = New JobEngine(CType(sender, BackgroundWorker))
m_oJobEngine.DownloadFile(CStr(e.Argument))
End Sub
進行状況をユーザーに報告するために、クラスによって発生したイベントをメイン フォームで処理できます。ジョブ クラス オブジェクトの宣言に WithEvents キーワードが含まれていることを確認する必要があります。これらのハンドラーから、BackgroundWorker の ReportProgress メソッドを呼び出すことができます。ReportProgress 内から、進行状況を示すために UI に必要な変更を加えることができます。次に例を示します。
Private Sub m_oJobEngine.DownloadProgress(ByVal bgw as Backgroundworker, ByVal bytesTransferred as Long) Handles m_oJobEngine.DownloadProgress
bgw.ReportProgress(0, bytesTransferred)
End Sub
Private Sub bgwMain_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwMain.ProgressChanged
lblStatus.Text = CLng(e.UserState).ToString & " bytes transferred."
End Sub
お役に立てれば。