これは特定のフォームを持つ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を見つけましたが、最終的には役に立たなかったです。
これは単なるデバッガの奇妙なものです。あなたは、そのタイプの例外を壊さないようにVSに指示することができます。 –
@StephenClearyでも、オーバーフロー例外が発生してもいつでも中断しないでしょうか?私はそれを望んでいない、そうですか?デバッガではなく、インストールされたアプリケーションとして実行すると、期待どおりに動作しなくてはならないと言っていますか? – Andarta
はい、デバッガの外でうまくいくでしょう。 –