4

Winform OpenFileDialog,每次打开,内存都会增加,dispose()和OpenFileDialog = null都不行,内存不会丢失。.

如何解决这个问题?

   private void btnLocalPicture_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofdSelectPicture = new OpenFileDialog();
        ofdSelectPicture.Filter = "PicFile|*.jpg;*.png;*.jpeg;*.gif;*.bmp;*.tif";
        if (ofdSelectPicture.ShowDialog() == DialogResult.OK)
        {
            if (showPicture != null)
                showPicture.Dispose();
            showPicture = Image.FromFile(ofdSelectPicture.FileName);
            if (pbShowPicture.Image != null)
                pbShowPicture.Image.Dispose();
            pbShowPicture.Image = showPicture;
            path = ofdSelectPicture.FileName;
            WordTip.Visible = false;
            if (pbShowPicture.Image != null)
                picOK.Enabled = true;
        }
        ofdSelectPicture.Dispose(); //not working
        ofdSelectPicture = null;  //not working
        GC.Collect();
    }
4

1 回答 1

7

您可以查看 Project + Properties 的“调试”选项卡发生了什么,勾选“启用非托管调试”选项。启动您的程序并选择输出窗口。获取显示的对话框。

您现在将看到加载到您的进程中的 DLL 列表。这些是在您的机器上注册的 shell 扩展。你会得到什么是不可预测的,每个人都有自己喜欢的扩展集。程序员往往有很多。

是的,这些扩展会在您的进程中消耗内存。只是因为这些 DLL 占用了您的虚拟内存地址空间中的空间。还因为这些 DLL 分配内存供自己使用。写得不好肯定会泄漏内存。请注意,这些扩展分配的内存始终是非托管内存,因此请确保您有一个可以显示泄漏的好工具。像 TaskMgr.exe 这样的东西还不够好。

你可以做两件基本的事情。首先是忽略它,这个问题是特定于你的机器的,你的用户不会有同样的问题。您无法修复泄漏,您没有扩展的源代码。或者,您可以使用 SysInternals 的 AutoRuns 实用程序追查麻烦制造者。它向您显示注册了哪些 shell 扩展,并允许您通过单击复选框来取消注册它们。

于 2012-07-29T13:12:54.960 回答