Visual Basic .NET Language
BackgroundWorker
サーチ…
BackgroundWorkerの使用
バックグラウンドワーカーとのタスクの実行。
ツールボックスからBackgroundWorker
コントロールをダブルクリックします。
これは、追加後に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_Click
、 Textbox_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