.Net IsNothing и Is Not Nothing, вызывающие исключение в блоке Catch/ finally при использовании задач

**Редактировать

  1. Снимите флажок "Включить оптимизации" в опциях предварительной компиляции, не будет вызывать эту ошибку.

  2. Удаление цикла For в коде также не вызовет этой проблемы.

  3. Присвоение переменной SF переменной уровня класса и проверка этого ни за что не вызовет этой проблемы.

Конец Редактировать **

Мой обработчик события нажатия кнопки имеет локальные переменные SF и HostSystem, которые я заполняю из базы данных SQLite с помощью EF6.

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

В блоке finally я проверяю, является ли SF пустым, вызывая методы IsNothing/ IsNot Nothing. Однако эти конструкции выдают ошибку ("Ссылка на объект не установлена ​​для экземпляра объекта"). Бывает только в режиме Release.

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

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim Hostsystem As SupportSystem
    Dim SF As SendFile

    Try

        SF = db.SendFiles.FirstOrDefault(Function(SFile) SFile.Name = "DailySummary")
        Hostsystem = db.SupportSystems.FirstOrDefault(Function(x) x.Name = SF.SupportSystemName)


        For i = 1 To 1

            Dim TaskSendFile As Task(Of String) = Task(Of String).Factory.StartNew(Function()
                                                                                       Throw New ApplicationException("App Error")
                                                                                       Return ""
                                                                                   End Function)
            Await TaskSendFile

        Next

        MessageBox.Show("All Done")

    Catch ex As Exception
        MessageBox.Show("Error : " + ex.Message)
    Finally
        Try
            **'The below check is what is throwing error.** 
            If Not IsNothing(SF) Then
            End If
        Catch ex As Exception
            MessageBox.Show("Unexpected Error in the finally block. " + ex.StackTrace)
        End Try
    End Try
End Sub

0 ответов

Другие вопросы по тегам