Сохранение документа PDF, кажется, сохраняет ссылку в памяти (VB.NET) - PullRequest
1 голос
/ 25 мая 2011

У меня есть пользовательский элемент управления VB.NET, который сохраняет документ PDF и затем отображает его в элементе управления WebBrowser. Код выглядит так:

Using myPdfDoc As New FileStream(fileName, FileMode.Create)
    Dim byt As Byte() = comLib.GetData();
    If Not byt Is Nothing Then                        
        myPdfDoc.Write(byt, 0, byt.Length)
        myPdfDoc.Flush()
        myPdfDoc.Close()

        webBrowserCtl.Navigate(fileName)
    End If
End Using

comLib - это библиотека взаимодействия COM, написанная на VB6, которая получает соответствующие данные.

Насколько я могу судить, в этом коде хранится ссылка на документ PDF (поскольку VB.NET не закрывается после завершения программы). Я нашел эту статью, которая, кажется, подразумевает, что Adobe не убирает за собой должным образом, но реализация предложенных изменений, кажется, не помогает.

Почему я могу получить такое поведение? В VB6 программа, которая не закрывалась должным образом, всегда была результатом ошибочных ссылок на объекты, которые не были очищены. Это все еще верно в VB.NET? Если да, что я могу сделать, чтобы определить, какой объект или почему это может происходить?

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Я бы выделил это: чтение данных, запись данных и просмотр данных:

Dim byt As Byte() = Nothing
Try
  byt = comLib.GetData()
Finally
  If Not comLib Is Nothing Then
    Marshal.ReleaseComObject(comLib)
  End If
End Try

If Not byt Is Nothing Then
  Using myPdfDoc As New FileStream(fileName, FileMode.Create)
    myPdfDoc.Write(byt, 0, byt.Length)
  End Using

  Using webBrowserCtl As New WebBrowser()
    webBrowserCtl.Navigate(fileName)      
  End Using
End If  

Вызов Marshal.ReleaseComObject в методе Final гарантирует, что счетчик ссылок всегда уменьшается.Flush и Close не нужны, так как Dispose сделает это в любом случае.Элемент управления WebBrowser реализует IDisposable, поэтому для этого я также использовал блок Using.

0 голосов
/ 25 мая 2011

Вы делаете что-то более сложное, чем то, что я делал в прошлом.Но я могу вам сказать, что байтовые объекты PDF в .NET могут жевать чрезвычайно большие объемы памяти (даже если расположены).Я бы предложил использовать временные файлы на вашем файловом сервере (в реальном каталоге на компьютере, на котором работает ваш веб-сервер).Вместо того, чтобы хранить объекты в памяти.Я знаю, что в сборке PDFSharp есть хороший (и бесплатный) код, который вы можете использовать.Но я не знаю, что помешало бы завершению вашей программы.Удачи тебе, приятель.

PS: Вы можете попытаться вызвать сборщик мусора самостоятельно.И вы должны иметь возможность видеть свои потоки в Visual Studio.Когда вы подключаетесь к процессу w3wp.exe (процесс IIS 7 в Windows 7), вы получаете контекстное меню (Debug-> Windows-> Threads).Хотя я не знаю, будет ли там показываться поток COM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...