Как мне реализовать свой код так, чтобы предотвратить получение объекта 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 в любом случае ничего для вас не делает, поэтому просто удалите его и посмотрите, исправит ли он проблему.