【发布时间】:2013-01-09 06:53:34
【问题描述】:
我对 C# 编程还很陌生,GC 的概念及其对 IDisposable 的定义仍然有点模糊。就垃圾收集而言,调用 Dispose 意味着什么? 具体来说,我想知道以下代码是否会偶尔失败,具体取决于垃圾收集何时启动。(我无法在测试期间使其崩溃)。
//List<TestClass2> tc2List;
//TestClass2 invokes a thread. It implements IDisposable.
//Its Dispose() sets a stop-condition for the thread,
//and joins the thread, awaiting it to stop. (may take 100 msek)
tc2List.RemoveAll(t =>
{
if (String.Compare(t.Name, "Orange") == 0)
{
t.Dispose(); //May take up to 100 msek
return true;
}
return false;
});
【问题讨论】:
-
如果您是编程新手,请忽略垃圾收集器。他会自动做正确的事情。对包含非托管资源(如 Connections)的对象使用
using,否则不要显式调用 dispose。 -
IDisposable仅在有 unmanaged(即不是内存;例如考虑 OS 文件句柄)资源在使用时才相关。IDisposable的对象通常与 GC 交互,因为它们安排在其内存被回收后自动处置,以作为安全措施,但就连接而言。 GC 和IDisposable在其他方面无关。 -
我的帖子中没有提到这一点,但是该类将保留一个串行端口,直到线程停止。我需要确保它已发布。
-
@Jon:“IDisposable 仅在存在非托管(即非内存;例如考虑 OS 文件句柄)资源在使用时才相关。” - 不是真的。例如,当您在关闭表单时取消事件处理程序时,这一点也很重要。如果您不取消挂钩事件处理程序,您可能会发生内存泄漏。一个合理的解决方案是在这些情况下使用 IDisposable,即使您正在释放的“资源”不是非托管的。例如见stackoverflow.com/questions/452281/…(也见msdn.microsoft.com/en-us/library/aa970850.aspx)
-
@MatthewWatson:当然,但这不是技术手册。这是一个专门针对完全新手的简短宣传。我相信你明白了。
标签: c# garbage-collection dispose removeall