BackgroundWorkerの並列処理


youta  2013-10-22 00:47:32  No: 148233  IP: [192.*.*.*]

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


どうかご教授の程、宜しくお願い致します。

編集    削除
youta  2013-10-22 00:59:33  No: 148234  IP: [192.*.*.*]

DoWorkイベントは非同期ですが、ProgressChangedイベントは
非同期にはならないのでしょうか?

編集    削除
YuO  2013-10-22 02:59:25  No: 148235  IP: [192.*.*.*]

DoWorkイベント以外は,すべてUIスレッドで動作します。
なので,ProgressChangedイベントは同期動作しますし,
ProgressChangedイベント中でThread.Sleepを使ってはいけません。

編集    削除
shu  2013-11-08 18:05:26  No: 148236  IP: [192.*.*.*]

ProgressChangedイベントは
UIスレッドで発生しますが、BackGroundWorkerのスレッドと
同期して動いているわけではありません。
BackGroundWorkerのスレッドでProgressChangedのイベント
処理が終了せずともその後の処理は継続されます。

今回の場合ProgressChangedが同じUIスレッドで発生してしまっているので
後から発生した方が処理待ちになっているだけです。

スレッド内でSleepを使うと別のスレッドへ処理が移りますが、自分の
スレッドの処理は止まってしまいますので後から発生したProgressChangedに
処理が移るわけではありません。ProgressChanged内で重たい処理があるのなら別スレッドを立てそれに任せた方がよいです。

編集    削除