サーチ…


BackgroundWorkerの使用

バックグラウンドワーカーとのタスクの実行。

ツールボックスからBackgroundWorkerコントロールをダブルクリックします。

ツールボックスのBackroundWorkerコントロール

これは、追加後にBackgroundWorkerが表示される方法です。

ここに画像の説明を入力

追加されたコントロールをダブルクリックしてBackgroundWorker1_DoWorkイベントを取得し、BackgroundWorkerが呼び出されたときに実行されるコードを追加します。このようなもの:

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    'Do the time consuming background task here

End Sub

タスクを実行するためにBackgroundWorkerを呼び出すことは、 Button_ClickTextbox_TextChangedなどの任意のイベントで以下のように行うことができます:

BackgroundWorker1.RunWorkerAsync()

RunWorkerCompletedイベントを変更して、BackgroundWorkerのタスク終了イベントを次のように取得します。

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MsgBox("Done")
End Sub

作業者が割り当てられたタスクをDoneすると、 Done示すメッセージボックスが表示されます。

BackgroundWorkerのGUIコンポーネントへのアクセス

BackgroudWorkerからGUIコンポーネントにアクセスすることはできません。たとえば、このようなことをしようとすると

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    TextBox1.Text = "Done"
End Sub

「クロススレッド操作が有効でない:Control 'TextBox1'が作成されたスレッド以外のスレッドからアクセスされた」というランタイムエラーが表示されます。

これは、BackgroundWorkerがメインスレッドと並行して別のスレッドでコードを実行し、GUIコンポーネントがスレッドセーフではないためです。 Invokeメソッドを使用してメインスレッド上で実行されるようにコードを設定し、デリゲートを与えなければなりません:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub

または、BackgroundWorkerのReportProgressメソッドを使用することもできます。

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.BackgroundWorker1.ReportProgress(0, "Done")
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
    Me.TextBox1.Text = DirectCast(e.UserState, String)
End Sub


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow