1

我有一个 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 中仍然成立吗?如果是这样,我该怎么做才能确定哪个对象,或者为什么会发生这种情况?

4

2 回答 2

1

我会将其分开:读取数据、写入数据和查看数据:

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  

Final 中的 Marshal.ReleaseComObject 调用确保引用计数始终递减。Flush 和 Close 不是必需的,因为 Dispose 无论如何都会这样做。WebBrowser 控件实现了 IDisposable,因此我也为此使用了 Using 块。

于 2011-06-02T16:22:56.783 回答
0

你正在做的事情比我过去所做的更复杂。但我可以告诉你,.NET 中的 PDF 字节对象会消耗大量内存(即使已释放)。我建议在文件服务器上使用临时文件(在运行 Web 服务器的机器上的实际目录中)。而不是将对象保存在内存中。我知道 PDFSharp 程序集有一些您可以使用的好(免费)代码。但我不知道什么会阻止你的程序退出。祝你好运,伙计。

PS:您可能想尝试自己调用垃圾收集器。您应该能够在 Visual Studio 中看到您的线程。当您附加到 w3wp.exe(Windows 7 中的 IIS 7 进程)进程时,您将获得一个上下文菜单(Debug->Windows->Threads)。虽然我不知道那里是否会显示 COM 线程。

于 2011-05-25T15:50:54.787 回答