WPF中如何释放掉子窗体所有的非托管资源?

一只特立独行在风口上的猫 java开发工程师  2014-08-07 11:23:01
在WPF中子窗体使用了本地资源,也就是说使用了给定路径下的文件,但是我要释放掉当前窗体中所使用的资源,代码如下:
FileStream fs = File.OpenRead(currentResource);
DisposableResource resourceObj = null;
try
{
resourceObj = new DisposableResource(fs);//DisposableResource类里面基础了IDisposable,以便资源Dispose掉
resourceObj.DoSomethingWithResource();
//fs.Close();
}
finally
{
if (resourceObj != null)
{
resourceObj.Dispose();
}
}

但是根本就没有效果,不知道是不是FileStream fs = File.OpenRead(currentResource);这里出了问题,因为这个又重新打开了,如果这里出了问题那么该怎么改?
...全文
428 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
引用 4 楼 wodegege10 的回复:
using(FileStream fs = File.OpenRead(currentResource)) { DisposableResource resourceObj = null; try { resourceObj = new DisposableResource(fs);//DisposableResource类里面基础了IDisposable,以便资源Dispose掉 resourceObj.DoSomethingWithResource(); } finally { if (resourceObj != null) { resourceObj.Dispose(); } } }
这个还是没有效果,如果把这段代码注释掉的话内存还是差不多的。。。
回复
exception92 2014-08-07
引用 5 楼 Tian779278804 的回复:
[quote=引用 2 楼 duanzi_peng 的回复:]

if(fs!=null){
 fs.Close();
  fs.Dispose();
}
这个和我那个差不多啊。。。而且也没有释放掉内存,估计是fs的问题吧?因为我程序中已经打开了这个路径下的文件,在这里我又把这个文件打开然后再释放,最后结果相当于没有做任何操作,怎么获取已经打开的这个路径下的资源啊?关键问题应该在这里吧??[/quote] 打开过之后没有其它操作了没?试试使用using语句。
回复
引用 6 楼 yuwenge 的回复:
非托管资源没有统一管理的地方,需要自己代码显式释放。
上面的代码就是显示释放掉啊,可是不知道哪里出了问题,运行了上面的代码之后和没有运行上面的代码内存是差不多大小的。
回复
卧_槽 2014-08-07
非托管资源没有统一管理的地方,需要自己代码显式释放。
回复
引用 2 楼 duanzi_peng 的回复:

if(fs!=null){
 fs.Close();
  fs.Dispose();
}
这个和我那个差不多啊。。。而且也没有释放掉内存,估计是fs的问题吧?因为我程序中已经打开了这个路径下的文件,在这里我又把这个文件打开然后再释放,最后结果相当于没有做任何操作,怎么获取已经打开的这个路径下的资源啊?关键问题应该在这里吧??
回复
wenbin 2014-08-07
using(FileStream fs = File.OpenRead(currentResource)) { DisposableResource resourceObj = null; try { resourceObj = new DisposableResource(fs);//DisposableResource类里面基础了IDisposable,以便资源Dispose掉 resourceObj.DoSomethingWithResource(); } finally { if (resourceObj != null) { resourceObj.Dispose(); } } }
回复
引用
说了是非托管资源啊,GC.Collect是回收托管资源的,能不能看下题目在回答啊
回复
exception92 2014-08-07

if(fs!=null){
 fs.Close();
  fs.Dispose();
}
回复
wangnaisheng 2014-08-07
GC.Collect();
回复
exception92 2014-08-07
引用 10 楼 Tian779278804 的回复:
[quote=引用 8 楼 duanzi_peng 的回复:] [quote=引用 5 楼 Tian779278804 的回复:] [quote=引用 2 楼 duanzi_peng 的回复:]

if(fs!=null){
 fs.Close();
  fs.Dispose();
}
这个和我那个差不多啊。。。而且也没有释放掉内存,估计是fs的问题吧?因为我程序中已经打开了这个路径下的文件,在这里我又把这个文件打开然后再释放,最后结果相当于没有做任何操作,怎么获取已经打开的这个路径下的资源啊?关键问题应该在这里吧??[/quote] 打开过之后没有其它操作了没?试试使用using语句。[/quote] 没有了,打开之后用工具查看了内存,和关闭之后的内存差不多的。using也是没有效果的。[/quote] 参考吧: http://msdn.microsoft.com/zh-cn/library/vstudio/b1yfkh5e(v=vs.100).aspx
回复
引用 8 楼 duanzi_peng 的回复:
[quote=引用 5 楼 Tian779278804 的回复:] [quote=引用 2 楼 duanzi_peng 的回复:]

if(fs!=null){
 fs.Close();
  fs.Dispose();
}
这个和我那个差不多啊。。。而且也没有释放掉内存,估计是fs的问题吧?因为我程序中已经打开了这个路径下的文件,在这里我又把这个文件打开然后再释放,最后结果相当于没有做任何操作,怎么获取已经打开的这个路径下的资源啊?关键问题应该在这里吧??[/quote] 打开过之后没有其它操作了没?试试使用using语句。[/quote] 没有了,打开之后用工具查看了内存,和关闭之后的内存差不多的。using也是没有效果的。
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2014-08-07 11:23
社区公告

让您成为最强悍的C#开发者