关于using和System.GC.Collect()对于释放资源的讨论!

时间:2022-01-24 19:27:21
如题。。。
以最简单的释放窗体资源为例
可以通过using(){}实现资源释放
也可以在form.FormClosing的时候 通过System.GC.Collect()释放资源
可是区别在哪呢

17 个解决方案

#1


using 是即时释放.

#2


System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即

#3


引用 2 楼  的回复:
System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即

using应该是释放{}中间的资源  运行到‘}’也就释放完了 对吧?

#4


引用 3 楼  的回复:
引用 2 楼  的回复:

System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即

using应该是释放{}中间的资源  运行到‘}’也就释放完了 对吧?

是,但是内存并不一定会立即得到回收

#5


引用 4 楼  的回复:
引用 3 楼  的回复:

引用 2 楼  的回复:
...

是,但是内存并不一定会立即得到回收

这样啊?那什么时候会回收?

#6


非托管资源的托管示例,有许多其他类别的非托管资源和封装这些资源的类库类型。所有这些类型都必须实现 IDisposable 接口。
using(){}
对象不需要显示调用Dispose();

GC.Collect();遵循垃圾回收机制,分层回收

#7


如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

#8


引用 2 楼  的回复:
System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即


+1

#9


GC.Collect是即时释放,而using只是在出了{}后告诉GC我是可以释放的资源,到底何时释放,得看GC

#10


引用 7 楼  的回复:
如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

不是啊 我们公司的系统里 有不少窗体都是通过模式化窗体打开  
关闭以后 没处理资源释放 所以我们老大跟我提到这里
说以后尽量操作完以后  释放资源  可以dispose或者using
后来我想到还有 GC.Collect()  所以就上来问一下

#11


而且using有一个好处,他相当于在finally块中的Dispose,这样保证即时中途有异常,也能正常释放资源

#12


引用 10 楼  的回复:
引用 7 楼  的回复:

如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

不是啊 我们公司的系统里 有不少窗体都是通过模式化窗体打开  
关闭以后 没处理资源释放 所以我们老大跟我提到这里
说以后尽量操作完以后  释放资源  可以dispose或者using
后来我想到还有 GC.Collect()  所以就上来问一下

using和dispose都不能即时释放的,必须得GC.Collect(),而微软建议不要手动调用GC.Collect(),影响性能

#13


引用 10 楼  的回复:
引用 7 楼  的回复:

如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

不是啊 我们公司的系统里 有不少窗体都是通过模式化窗体打开  
关闭以后 没处理资源释放 所以我们老大跟我提到这里
说以后尽量操作完以后  释放资源  可以dispose或者using
后来我想到还有 GC.Collect()  所以就上来问一下


释放非托管的资源可以Dispose(). 如果你没有Dispose,GC什么的也没用。
老大强调的是叫你Dispose.没叫你手动倒垃圾。

#14


引用 12 楼  的回复:
...
using和dispose都不能即时释放的,必须得GC.Collect(),而微软建议不要手动调用GC.Collect(),影响性能

不手动调用GC.Collect()  那该怎么做?不能在FormClosing里通过System.GC.Collect()释放?

#15


using可以释放资源,GC释放内存,using完之后的内容就被标示了可以被GC,但是释放的时间不确定,可能就是下次GC运行的时候.不过,我也很想知道,Dispose以后的内容,其内存是被立刻释放了吗?还是等下次GC扫描呢?

#16


Dispose释放的是非托管资源,当然是立即释放。托管资源那是由GC决定何时释放。这个和回收策略有关。
所以,这些倒垃圾的脏活累活,你还是不要亲力亲为了。系统会帮你处理的。

#17


有些时候就不行了 做了个东西 运行一段时间后总会出现内存泄露,只能GC.Collect(),不过好像会影响程序的性能

#1


using 是即时释放.

#2


System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即

#3


引用 2 楼  的回复:
System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即

using应该是释放{}中间的资源  运行到‘}’也就释放完了 对吧?

#4


引用 3 楼  的回复:
引用 2 楼  的回复:

System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即

using应该是释放{}中间的资源  运行到‘}’也就释放完了 对吧?

是,但是内存并不一定会立即得到回收

#5


引用 4 楼  的回复:
引用 3 楼  的回复:

引用 2 楼  的回复:
...

是,但是内存并不一定会立即得到回收

这样啊?那什么时候会回收?

#6


非托管资源的托管示例,有许多其他类别的非托管资源和封装这些资源的类库类型。所有这些类型都必须实现 IDisposable 接口。
using(){}
对象不需要显示调用Dispose();

GC.Collect();遵循垃圾回收机制,分层回收

#7


如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

#8


引用 2 楼  的回复:
System.GC.Collect(),强制立即回收

using,系统会在适时的时候进行回收,不一定是立即


+1

#9


GC.Collect是即时释放,而using只是在出了{}后告诉GC我是可以释放的资源,到底何时释放,得看GC

#10


引用 7 楼  的回复:
如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

不是啊 我们公司的系统里 有不少窗体都是通过模式化窗体打开  
关闭以后 没处理资源释放 所以我们老大跟我提到这里
说以后尽量操作完以后  释放资源  可以dispose或者using
后来我想到还有 GC.Collect()  所以就上来问一下

#11


而且using有一个好处,他相当于在finally块中的Dispose,这样保证即时中途有异常,也能正常释放资源

#12


引用 10 楼  的回复:
引用 7 楼  的回复:

如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

不是啊 我们公司的系统里 有不少窗体都是通过模式化窗体打开  
关闭以后 没处理资源释放 所以我们老大跟我提到这里
说以后尽量操作完以后  释放资源  可以dispose或者using
后来我想到还有 GC.Collect()  所以就上来问一下

using和dispose都不能即时释放的,必须得GC.Collect(),而微软建议不要手动调用GC.Collect(),影响性能

#13


引用 10 楼  的回复:
引用 7 楼  的回复:

如果你总是想要手动搞这个,那与.net设计的初衷和卖点就背道而驰了。

不是啊 我们公司的系统里 有不少窗体都是通过模式化窗体打开  
关闭以后 没处理资源释放 所以我们老大跟我提到这里
说以后尽量操作完以后  释放资源  可以dispose或者using
后来我想到还有 GC.Collect()  所以就上来问一下


释放非托管的资源可以Dispose(). 如果你没有Dispose,GC什么的也没用。
老大强调的是叫你Dispose.没叫你手动倒垃圾。

#14


引用 12 楼  的回复:
...
using和dispose都不能即时释放的,必须得GC.Collect(),而微软建议不要手动调用GC.Collect(),影响性能

不手动调用GC.Collect()  那该怎么做?不能在FormClosing里通过System.GC.Collect()释放?

#15


using可以释放资源,GC释放内存,using完之后的内容就被标示了可以被GC,但是释放的时间不确定,可能就是下次GC运行的时候.不过,我也很想知道,Dispose以后的内容,其内存是被立刻释放了吗?还是等下次GC扫描呢?

#16


Dispose释放的是非托管资源,当然是立即释放。托管资源那是由GC决定何时释放。这个和回收策略有关。
所以,这些倒垃圾的脏活累活,你还是不要亲力亲为了。系统会帮你处理的。

#17


有些时候就不行了 做了个东西 运行一段时间后总会出现内存泄露,只能GC.Collect(),不过好像会影响程序的性能