2016-03-28 3 views
0

Я прочитал почти все сообщения о байт-массивах в структуре .net и о том, как работает GC, но я все еще в недоумении. Во-первых, код, я работаю с:VB.Net ByteArray Memory Leak

Public Sub SomeFunction(ByVal page As Integer, ByVal xml As String) 

     Dim fileBytes As Byte() 

     Using imageStream As New IO.FileStream(_imageFile, IO.FileMode.Open) 

      fileBytes = Array.CreateInstance(GetType(Byte), imageStream.Length) 

      imageStream.Read(fileBytes, 0, imageStream.Length) 
      imageStream.Close() 

     End Using 

     Using ms As New IO.MemoryStream(fileBytes) 

      Dim tiff As New Atalasoft.Imaging.Codec.Tiff.TiffFile 

      tiff.Read(ms) 

      Dim tag = tiff.Images(page - 1).Tags.LookupTag(58000) 

      If tag IsNot Nothing Then 
       tiff.Images(page - 1).Tags.Remove(tag) 
      End If 

      tag = New Atalasoft.Imaging.Metadata.TiffTag(58000, System.Text.Encoding.ASCII.GetBytes(xml)) 
      tiff.Images(page - 1).Tags.Add(tag) 

      tiff.Save(_imageFile) 

     End Using 

    End Sub 

В начале метода, я устанавливаю fileBytes к Array.CreateInstance ... а потом к низу я спасаю файл изображения. Это означает, что я должен перезагружать ByteArray каждый раз, потому что файл меняется, на который я смотрю, поэтому я не могу просто повторно использовать. Все внутри с помощью операторов, а fileBytes ДОЛЖНЫ быть уничтожены, когда выполнение выходит из метода, но оно НИКОГДА не очищается, а память продолжает увеличиваться до тех пор, пока не произойдет исключение SystemOutOfMemoryException. Если GC не выпускает память до тех пор, пока она не требуется, предположительно, она не освобождает ее здесь, даже если она нужна. Как я могу заставить fileBytes освобождать свою память между вызовами SomeFunction()?

Спасибо!

+0

Вы пытались определить 'fileBytes' вне функции (как переменная уровня класса?) – vbnet3d

+0

Байт-массивы dont/can not leak. Более похоже, что файл TIFF хотел бы быть удаленным. Если у него есть метод «Dispose», используйте его. – Plutonix

+0

Хорошо, возможно, «утечка» - это неправильное слово, но это определенно файлBytes(), который не освобождает память, поскольку я прошел через нее и могу наблюдать, как она увеличивается каждый раз, когда она установлена, а затем она никогда не выпускается. – DonnieDarko

ответ

0

Я пробовал несколько вещей, передавая массив байтов извне, а также создавая отдельный класс, который обрабатывает и уничтожается каждый раунд. Ничего не сработало. Поэтому я просто сделал шаг назад и посмотрел на него. Не нужно было создавать массив для каждой страницы, а затем сохранить документ после добавления аннотации к отдельной странице. Я изменил его так, что я получаю массив один раз перед циклом через каждую страницу и добавляю аннотации для этой страницы, а затем просто сохраняю один раз в конце. Просто, просто нужно сделать шаг назад и посмотреть на него по-другому, а не на то, что уже было правильно.