Если есть возможность продолжить цикл For Each после ошибки в VB.NET?

У меня есть BackGroundWorker с циклом For Each, который находится внутри Try Catch, и мне нужно обнаружить ошибку и продолжить цикл For Each без следующего элемента.

На самом деле у меня есть список данных для отправки на сервер через UDP и ожидания ACK, но если сервер не ответил в течение 5 секунд, ошибка тайм-аута кэшируется, и весь процесс прерывается.

Мне нужно сделать что-то вроде этого

Dim MyData_Array As String()
For Each MyData As String In MyData_Array

                MyData_Actual = MyData
                ' Translate the passed message into ASCII and store it as a Byte array.
                Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(MyData)
                Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)


                If data.Length = 67 Then
                    XMyData += 1
                    Dim Tx As New UdpClient()
                    Tx.Connect(Host, Port)
                    Tx.Client.SendTimeout = 5000
                    Tx.Client.ReceiveTimeout = 5000

                    Tx.Send(data, data.Length)
                    data = Tx.Receive(RemoteIpEndPoint)

                    Tx.Close()
                Else

                    MyData_ErrorList += MyData & vbCrLf

                End If
                'Report progress
                Porcentaje = (XMyData * 100) / MyData_Array.Count
                BackgroundWorker1.ReportProgress(Porcentaje, "Sending MyData " & XMyData.ToString & " de " & MyData_Array.Count.ToString & " : " & MyData)
                If BackgroundWorker1.CancellationPending Then
                    e.Cancel = True
                    Exit For
                End If
            Next

        End If

    Catch ex As TimeoutException
        MyData_ErrorList += MyData_Actual & vbCrLf
  '**********************************************************
        'Here need to delay 100mS and get back to the For Each to process the next item
  '**********************************************************
    Catch ex As Exception

        MyData_List = ex.Message & vbCrLf & "StackTrace: " & ex.StackTrace & vbCrLf & MyData_List
    End Try

2 ответа

Решение

Поместите Try/Catch внутри цикла for.

    Dim MyData_Array As String()
    For Each MyData As String In MyData_Array
      Try
        MyData_Actual = MyData
        ' Translate the passed message into ASCII and store it as a Byte array.
        Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(MyData)
        Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)


        If data.Length = 67 Then
            XMyData += 1
            Dim Tx As New UdpClient()
            Tx.Connect(Host, Port)
            Tx.Client.SendTimeout = 5000
            Tx.Client.ReceiveTimeout = 5000

            Tx.Send(data, data.Length)
            data = Tx.Receive(RemoteIpEndPoint)

            Tx.Close()
        Else

            MyData_ErrorList += MyData & vbCrLf

        End If
        'Report progress
        Porcentaje = (XMyData * 100) / MyData_Array.Count
        BackgroundWorker1.ReportProgress(Porcentaje, "Sending MyData " & XMyData.ToString & " de " & MyData_Array.Count.ToString & " : " & MyData)
        If BackgroundWorker1.CancellationPending Then
            e.Cancel = True
            Exit For
        End If
      Catch ex As TimeoutException
        MyData_ErrorList += MyData_Actual & vbCrLf

      Catch ex As Exception
        MyData_List = ex.Message & vbCrLf & "StackTrace: " & ex.StackTrace & vbCrLf & MyData_List
       'If you want to exit the For loop on generic exceptions, uncomment the following line
       'Exit For

      End Try
    Next             

Вы можете подумать о том, чтобы поместить цикл try внутри цикла for, если итеративная коллекция не изменена каким-либо образом из-за ошибки. Затем обработайте исключение и продолжите цикл for.

То, как у вас сейчас есть ваш цикл и настройка try/catch, приведет к разрыву всего цикла в исключении тайм-аута, поскольку try/catch находится вне цикла.

Ваш код будет выглядеть примерно так:

For Each MyData As String In MyData_Array
    Try
        'Perform code for each loop iteration
    Catch ex As TimeoutException
        'Handle Exception Here 
    End Try
Next
Другие вопросы по тегам