Это приложение для форм Windows, в котором у меня есть конкретная форма. В этой форме я показываю ход некоторой обработки, которая должна выполняться в фоновом режиме асинхронно. Все это отлично работает, за исключением тех случаев, когда я пытаюсь обрабатывать исключения, которые пойманы в фоновом режиме ....Исключение исключения из sub для асинхронного вызова
Это подмножество в коде моей формы, который вызывает функцию 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
Когда я запускаю этот код с данными, которые, как мне известно, заканчиваются созданием ошибки в sub B, ошибка распространяется до того, как до метода, который непосредственно вызывается функцией async .... Поэтому при работе в VS он останавливается в «Throw New Exception (« Ошибка создания транспортных средств при импульсе ») & pulsePointer &". «& ex.Message)», с сообщением, содержащим сообщение, брошенный к югу B.
Это то, что говорит, что отладчик на этой линии:
Исключение типа «System.Exception» произошло в MyProject.exe, но не был обработан в коде пользователя. Дополнительная информация: Ошибка при создании транспортных средств при импульсе .... [сообщение об ошибке распространялось, как показано на рисунке subs]. Арифметическая операция привела к переполнению.
Тогда как ни странно, в отладчик, если я нажимаю «Step Into», он затем вернуться к югу в моей форме, которая называется функцией Async, которая показывает окно с сообщением о графическом интерфейсе.
Так как я могу получить это, чтобы автоматически вернуться к исходному коду формы, чтобы показать окно сообщения? Почему он останавливается, где он останавливается, не продолжая распространяться?
FYI, я нашел this question, но это в конечном счете не помогло.
Это просто отвлекающая приманка. Вы можете сказать VS, чтобы не нарушать этот тип исключения. –
@StephenCleary, но разве это не заставило бы его не прерываться в любое время, когда сталкивается с переполнением исключения? Я не хочу этого, не так ли? Вы говорите, что все должно работать, как ожидалось, когда я запускаю его как установленное приложение, а не в отладчике? – Andarta
Да, это, вероятно, отлично работает вне отладчика. –