2016-08-16 15 views
0

これは特定のフォームを持つWindowsフォームアプリケーションです。このフォームでは、バックグラウンドで非同期に発生するはずの処理の進行状況を表示します。すべては、バックグラウンド処理内で捕捉された例外を処理しようとする場合を除いて、偉大なものです。非同期呼び出しから非同期呼び出しに例外をスローする

これは、私のフォームのコードで、すべてを含むモジュールのAsync関数を呼び出すサブですバックグラウンド処理コードは:

Public Async Sub BasicProcessing() 
     Try 
      Dim processTarget As Action(Of Integer) 
      processTarget = AddressOf UpdatePulseProcessing 
      myProgress = New Progress(Of Integer)(processTarget) 
      myCount.Vehicles = Await ProcessmyCountFile(myCount, myProgress) 

      If OperationCanceledByUser = True Then 
       Exit Sub 
      End If 
    Catch ex As Exception 
     MessageBox.Show(Me, "Unable to update count." _ 
         & Environment.NewLine & ex.Message, _ 
         "Error updating count", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     Exit Sub 
    End Try 
End Sub 

これは、別個のモジュールであり、それは呼び出し非同期関数である:

Public Function ProcessmyCountFile(CountToProcess As Count, ByVal ProgressObject As IProgress(Of Integer)) As Task(Of List(Of Vehicle)) 
    myProgressObject = ProgressObject 
    basicToken = New CancellationTokenSource 

    Try 
     Return CType(Task(Of List(Of Vehicle)).Run(Function() 

                 If basicToken.IsCancellationRequested Then 
                  Return Nothing 
                  Exit Function 
                 End If 

                 myCountFile = CountToProcess 
                 MyVehicles = New List(Of Vehicle) 

                 'All that is important in here to note is a call to a regular sub within this module 
                 CreateVehicles() 

                 Return MyVehicles 
                End Function, basicToken.Token), Global.System.Threading.Tasks.Task(Of List(Of Global.STARneXt.Vehicle))) 
    Catch ex As Exception 
     Throw New Exception(ex.Message) 
     Return Nothing 
    End Try 

End Function 

Public Sub StopProcess() 
    If Not basicToken Is Nothing Then 
     basicToken.Cancel() ' We tell our token to cancel 
    End If 
End Sub 

これは非同期関数によって呼び出される正規サブある:

Private Sub CreateVehicles() 

    Try 

     'In here are calls to other regular subs within the same module, let's just call them A and B 

    Catch ex As Exception 
     StopProcess() 
     Throw New Exception("Error creating vehicles at pulse " & pulsePointer & ". " & ex.Message) 
    End Try 

End Sub 

私が知っているデータでこのコードを実行すると、サブBでエラーが発生し、async関数によって直接呼び出されたメソッドまでエラーが伝播します。 したがって、VSで走っているときには、 "Throw New Exception(パルス" & pulsePointer & "で車両を作成する際にエラーが発生します。 「のSystem.Exception」の中で発生した

タイプの例外:これは、デバッガはその行に言うことであるB.

をサブによってスローされたメッセージを含むメッセージで「& ex.Message)」、 MyProject.exeではなく、 はユーザーコードで処理されませんでした。追加情報: 車両のパルス作成時のエラー。[ サブシステムと呼ばれるエラーメッセージがスローされて伝播しました。算術演算でオーバーフローが発生しました。

私が「ステップイン」を押した場合は、不思議なことですが、GUI上にメッセージボックスを表示するAsync関数を呼び出したフォームのサブフォームに戻ります。

メッセージボックスを表示するために元のフォームコードに自動的に戻るようにするにはどうすればよいですか?伝播を続けることなく停止する理由はなぜですか?

参考までにthis questionを見つけましたが、最終的には役に立たなかったです。

+0

これは単なるデバッガの奇妙なものです。あなたは、そのタイプの例外を壊さないようにVSに指示することができます。 –

+0

@StephenClearyでも、オーバーフロー例外が発生してもいつでも中断しないでしょうか?私はそれを望んでいない、そうですか?デバッガではなく、インストールされたアプリケーションとして実行すると、期待どおりに動作しなくてはならないと言っていますか? – Andarta

+1

はい、デバッガの外でうまくいくでしょう。 –

答えて

0

@StephenClearyは正しかったです。私は自分のプロジェクト用に新しいインストールをそのまま作成しました。インストールされたバージョンでは、予想されるエラーメッセージが表示されたメッセージボックスが表示されます。

デバッガ側で奇妙な動作が見られますが、少し落胆しますが、私の質問にレイアウトされたコードが実際に機能することは嬉しくないです。

関連する問題