トップ回答者
BackgroundWorkerにエラーを通知する方法

質問
-
おはようございます。
Vb2010+SQLServer2008Expressを使用しています。
プログレスバーを配置し、進捗状況を確認するフォームを汎用的に使用できるようにしてあります。
プログレスバーを呼び出し元になるフォームに「DoWorkイベント」のみを記述しております。
(プログレスバーを配置したフォームはShowDialogで呼び出しています。)そこで、DoWorkイベントの中の記述で、エラーではないがある特定の状態になった場合
(たとえば、ある処理の結果が「100」となった場合)、DialogResultをAbortにしたいと考えています。ただ、どのように調べても、なかなか解糖らしきものが見つかりません。
処理は、下記のようになっています。
Private Sub btn_Import_Timecard_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btn_Import_Timecard.Click’プログレスバーフォームを呼び出す
Dim pgb As MyLibrary.frmProgressbar2 = New MyLibrary.frmProgressbar2( _
"タイムカード取込中", _
New DoWorkEventHandler(AddressOf DoWork_ImportTimecard), _
MaxCount)
Dim result As DialogResult = pgb.ShowDialog(Me)
pgb.DispProgressBarResult(result, pgb)’バックグランド処理内容
Private Sub DoWork_ImportTimecard(ByVal sender As Object, _
ByVal e As DoWorkEventArgs)
Dim bgw As BackgroundWorker = DirectCast(sender, BackgroundWorker)Dim A as Integer=0
If A = 100 then
ここに、DialogResult.Abortを通知する処理を組み込みたい ← ここ
End If
以下はプログレスバーを配置してあるフォーム内に記述してあります。
'プログレスバーの結果表示
Public Sub DispProgressBarResult(ByVal result As DialogResult, _
ByVal pgb As frmProgressbar2)
If result = Windows.Forms.DialogResult.Cancel Then
MessageBox.Show("キャンセルされました。")
ElseIf result = Windows.Forms.DialogResult.Abort Then
Dim ex As Exception = Me.Error
MessageBox.Show("エラー:" & ex.Message)
ElseIf result = Windows.Forms.DialogResult.OK Then
'結果を取得する
Dim stopTime As Integer = CInt(pgb.Result)
MessageBox.Show("成功しました:" & stopTime.ToString)
End If
End Sub非常に分かりにくい記述となっていることは承知しておりますが、これ以上うまく説明することができません。
どうか、アドバイスお願いします。
すべての返信
-
ご回答ありがとうございます。
BackgroundWorkerはプログレスバーを配置してあるフォームに同様に配置してあります。
エラー処理が理解できていないせいですが、そもそも、どの段階でTry~Catchでエラー処理を
組み込むべきかがわかっていないことと、エラーではないが、ある状態になった場合には、
処理を中止するということをしたいので、今回質問をさせていただきました。例えば、FormのCommandButton_Clickにて、ClassAのAメソッドを呼び出す場合、
Aメソッド内にTry~Catchを記述するのか、それとも、CommandButton_Clickに
Try~Catchを記述するのか。また、値を返す関数の場合など、処理を継続したくない値が帰ってきた場合はどのようにして
処理を継続しないということを、プログレスバー(バックグランド側)に通知をするのか、ということが
知りたいです。 -
BackgroundWorkerのRunWorkerCompletedイベントで、イベント引数のResultプロパティやErrorプロパティを見るだけでは?
RunWorkerCompletedEventArgs::ResultはDoWorkイベントのイベント引数DoWorkEventArgsのResultプロパティで設定できます。またRunWorkerCompletedEventArgs::ErrorはDoWorkイベント内でキャッチされなかった例外が格納されます。ほかにCancelledプロパティもありますね。
プログレスバーのフォームはこれらのイベントで自分のDialogResultに適切な値を設定すればいいでしょう。
try-catchについては、想定の範囲内の例外ならcatchして、そうでなければ何もしない。それだけです。