BackgroundWorkerを2つ用意して並列処理を行いたいのですが、
どうも思惑通りに動きません。
BackgroundWorker1の処理とBackgroundWorker2の処理を別スレッドで
同時に実施したいのですが、BackgroundWorkerではそのような処理は
実現出来ないのでしょうか?
それともただ単に私のソースの記述に誤りがあるのでしょうか?
開発環境
Windows7 Professional SP1
Visual Studio 2010 Professional
以下、ソースです。
Imports System.ComponentModel
Imports System.Threading.Thread
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
BackgroundWorker1.WorkerReportsProgress = True
BackgroundWorker1.RunWorkerAsync(0)
BackgroundWorker2.WorkerReportsProgress = True
BackgroundWorker2.RunWorkerAsync(0)
End Sub
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim bgWorker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
bgWorker.ReportProgress(0)
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Sleep(5000)
St01_Form.Close()
End Sub
Private Sub BackgroundWorker2_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
Dim bgWorker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
bgWorker.ReportProgress(0)
End Sub
Private Sub BackgroundWorker2_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker2.ProgressChanged
Sleep(5000)
St02_Form.Close()
End Sub
どうかご教授の程、宜しくお願い致します。
DoWorkイベントは非同期ですが、ProgressChangedイベントは
非同期にはならないのでしょうか?
DoWorkイベント以外は,すべてUIスレッドで動作します。
なので,ProgressChangedイベントは同期動作しますし,
ProgressChangedイベント中でThread.Sleepを使ってはいけません。
ProgressChangedイベントは
UIスレッドで発生しますが、BackGroundWorkerのスレッドと
同期して動いているわけではありません。
BackGroundWorkerのスレッドでProgressChangedのイベント
処理が終了せずともその後の処理は継続されます。
今回の場合ProgressChangedが同じUIスレッドで発生してしまっているので
後から発生した方が処理待ちになっているだけです。
スレッド内でSleepを使うと別のスレッドへ処理が移りますが、自分の
スレッドの処理は止まってしまいますので後から発生したProgressChangedに
処理が移るわけではありません。ProgressChanged内で重たい処理があるのなら別スレッドを立てそれに任せた方がよいです。
ツイート | ![]() |