none
BackgroundWorkerにエラーを通知する方法 RRS feed

  • 質問

  • おはようございます。

    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

    非常に分かりにくい記述となっていることは承知しておりますが、これ以上うまく説明することができません。

    どうか、アドバイスお願いします。

    2012年10月18日 22:29

回答

すべての返信

  • Deleted
    2012年10月18日 23:20
  • ご回答ありがとうございます。

    BackgroundWorkerはプログレスバーを配置してあるフォームに同様に配置してあります。

    エラー処理が理解できていないせいですが、そもそも、どの段階でTry~Catchでエラー処理を
    組み込むべきかがわかっていないことと、エラーではないが、ある状態になった場合には、
    処理を中止するということをしたいので、今回質問をさせていただきました。

    例えば、FormのCommandButton_Clickにて、ClassAのAメソッドを呼び出す場合、
    Aメソッド内にTry~Catchを記述するのか、それとも、CommandButton_Clickに
    Try~Catchを記述するのか。

    また、値を返す関数の場合など、処理を継続したくない値が帰ってきた場合はどのようにして
    処理を継続しないということを、プログレスバー(バックグランド側)に通知をするのか、ということが
    知りたいです。

    2012年10月19日 1:19
  • BackgroundWorkerのRunWorkerCompletedイベントで、イベント引数のResultプロパティやErrorプロパティを見るだけでは?

    RunWorkerCompletedEventArgs::ResultはDoWorkイベントのイベント引数DoWorkEventArgsのResultプロパティで設定できます。またRunWorkerCompletedEventArgs::ErrorはDoWorkイベント内でキャッチされなかった例外が格納されます。ほかにCancelledプロパティもありますね。

    プログレスバーのフォームはこれらのイベントで自分のDialogResultに適切な値を設定すればいいでしょう。

    try-catchについては、想定の範囲内の例外ならcatchして、そうでなければ何もしない。それだけです。
    2012年10月19日 2:03
  • Hoshinaです
    こんにちは

    >処理を継続しないということを、プログレスバー(バックグランド側)に通知をするのか

    MSDNの資料を見ただけですが,CancellationPending プロパティというものがそのために用意されているように思います。

    親のスレッドが子供のスレッドを中断したい場合に,このプロパティにtrueを設定し,
    子供のスレッドは,処理の合間合間に,中断要求が着ていないかを確認しながら処理するような形式と思います。

    それでは

    2012年10月19日 2:15
  • Deleted
    • 回答としてマーク TI-cb400 2012年10月20日 12:07
    2012年10月19日 2:41