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();
}
答案 0 :(得分:7)
您可以通过Project + Properties,Debug选项卡查看正在进行的操作,勾选“启用非托管调试”选项。启动程序并选择“输出”窗口。显示对话框。
现在,您将看到加载到流程中的DLL列表。这些是在您的计算机上注册的shell扩展。你会得到的确切结果是不可预测的,每个人都有自己喜欢的扩展。程序员往往有很多。
是的,这些扩展会占用您进程中的内存。只是因为这些DLL占用了虚拟内存地址空间中的空间。但也因为这些DLL为自己分配内存。一个写得不好的人肯定会泄漏记忆。请注意,这些扩展分配的内存始终是非托管内存,因此请确保您有一个很好的工具来向您显示泄漏。像TaskMgr.exe这样的东西还不够好。
你可以做两件基本的事情。首先是忽略它,这个问题特定于您的机器,您的用户不会遇到同样的问题。您无法修复泄漏,您没有扩展的源代码。或者您可以使用SysInternals的AutoRuns实用程序来追踪麻烦制造者。它会显示已注册的shell扩展,并允许您通过单击复选框取消注册它们。