gaurav.s23 Ответов: 1

Как мне реализовать свой код так, чтобы предотвратить получение объекта disposed exception


Привет.

Я получил случайно расположенное исключение объекта в моем приложении 1 из 5 раз, если я запустил программу. Он не выбрасывает исключения каждый раз, когда я запускаю программу.

stacktrace говорит, что исключение происходит в строке, где file1 = nothing.

Как мне решить это неустойчивое поведение ?

Лучший способ имплементировать код?
Dim sbSQL As New StringBuilder
sbSQL.Append("SELECT Item_Id from MyTableA")
Dim ds1 As New DataSet
Using daFindOutdated As New SqlDataAdapter(sbSQL.ToString, cn)
    daFindOutdated.Fill(ds1)
End Using

Dim sbPath As New StringBuilder
For Each row As DataRow In ds1.Tables(0).Rows
    sbPath.Append(ConfigurationManager.AppSettings("ZipFilePath") & "TBL" & row.Item("Item_ID").ToString.PadLeft(5, "0") & ".zip")
    If File.Exists(sbPath.ToString) Then
        Dim zip As New ZipArchive(New DiskFile(sbPath.ToString))
        Dim folder1 As AbstractFolder = zip.GetFolder("\Item\File\")
        Dim file1 As AbstractFile = folder1.GetFile("Tbl.cpf")

        Using sw1 As New StreamWriter(file1.OpenWrite(True))
            sw1.AutoFlush = True
            sw1.WriteLine("")
            sw1.Close()
            file1 = Nothing
        End Using

        Dim folder2 As AbstractFolder = zip.GetFolder("\Item\File\")
        Dim file2 As AbstractFile = folder2.GetFile("Tbl.cmp")

        Using sw2 As New StreamWriter(file2.OpenWrite(True))
            sw2.AutoFlush = True
            sw2.WriteLine("")
            sw2.Close()
            file2 = Nothing
        End Using

        Dim folder3 As AbstractFolder = zip.GetFolder("\Item\File\")
        Dim file3 As AbstractFile = folder3.GetFile("Tbl.upc")

        Using sw3 As New StreamWriter(file3.OpenWrite(True))
            sw3.AutoFlush = True
            sw3.WriteLine("")
            sw3.Close()
            file3 = Nothing
        End Using

        zip = Nothing
    End If

    sbPath.Length = 0
Next


Что я уже пробовал:

Я попытался использовать систему.Нарезание резьбы.Нить.Sleep(1000) до того, как он ничего не назначит объекту file1 или zip. Но я не думаю, что это хорошая идея, или это поможет, или это не поможет. Более вероятно, что программа повторяет более 10000 раз, чтобы создать эти три разных zip-файла. Пожалуйста, помогите мне. Спасибо.

Ralf Meier

ОК...
- Почему ты ничего не назначить в файл file1,2,3 ? Я думаю, что это реликт от VB6 ...
- А что говорит ваш отладчик ? Я не думаю, что ошибка действительно происходит описанным способом ... Я бы сначала посмотрел, что происходит с file1, когда он назначен (если он назначен)

gaurav.s23

Как я уже сказал, мне нужно повторить более 10000 раз, чтобы создать zip-файл для каждого элемента в БД. Например, для item1 будет TBL00001.zip папка, в которой будут находиться файлы Tbl.cmp, tbl.cpf и tbl.upc. Stacktrace показывает исключение удаленного объекта в строке, где file1=nothing. Такое случается не каждый раз. Это происходит один раз в каждые 5/6 раз, когда я запускаю программу. Трудно отлаживать 10000 x3 раз, чтобы получить точку, где программа выбрасывает исключение, так как это происходит не всегда.

Ralf Meier

Простите , но я этого не читаю.
У меня есть следующие предложения :
- установите AutoFlush в False
- постройте Try-Catch вокруг каждого Using-блока, который может помочь вам отладить
- попробуйте уменьшить количество файлов - чем больше файлов у вас есть в одной папке, тем медленнее становится ваша система при чтении и записи ...

F-ES Sitecore

удалите строки" file1 = nothing", и если file1 имеет метод Dispose или Close, вызовите его после завершения использования.

gaurav.s23

Я не знаком с vb.net и еще. Это старый код, я его не писал. Я предполагаю, что здесь код вызывает file1 =nothing, так что когда код возвращается(в цикле), он создает новый объект file1 для нового файла . Например. TBL00002zip\item\file\tbl. cmp.

F-ES Sitecore

Он будет делать это в любом случае, если вы установите его в ничто или нет.

gaurav.s23

Исключение-objectDisposedException : невозможно получить доступ к удаленному объекту. Поэтому я подумал, что файл будет удален до того, как stream writer закончит свою работу над файлом?

gaurav.s23

Файл1 является объектом xceed.файловая система, и у нее нет метода close или dispose.

F-ES Sitecore

StreamWriter может избавляться от file1, когда вы вызываете close, который может быть источником вашей проблемы. Установка file1 в nothing в любом случае ничего для вас не делает, поэтому просто удалите его и посмотрите, исправит ли он проблему.

1 Ответов

Рейтинг:
0

heryalu

Зачем ты пишешь

sw1.Close()
file1 = Nothing


Я не знаком с visual basic, но использование оператора (вызов Dispose () StreamWriter) должно закрыть и удалить файл1.