2016-08-16 8 views
0

Это приложение для форм 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, но это в конечном счете не помогло.

+0

Это просто отвлекающая приманка. Вы можете сказать VS, чтобы не нарушать этот тип исключения. –

+0

@StephenCleary, но разве это не заставило бы его не прерываться в любое время, когда сталкивается с переполнением исключения? Я не хочу этого, не так ли? Вы говорите, что все должно работать, как ожидалось, когда я запускаю его как установленное приложение, а не в отладчике? – Andarta

+1

Да, это, вероятно, отлично работает вне отладчика. –

ответ

0

@ StephenCleary был прав - я создал новую установку для своего проекта, как есть, и в установленной версии я получаю окно сообщения с ожидаемым сообщением об ошибке.

Странное поведение со стороны отладчика и немного обескураживающее, но, тем не менее, я рад, что мой код, изложенный в моем вопросе, действительно работает.

Смежные вопросы