我对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;
});
答案 0 :(得分:4)
你的代码有效,但风格很糟糕。谓词不应该有副作用。所以你应该首先处理元素,然后删除它们。
Predicate<T> filter = t => t.Name == "Orange";
foreach(var t in tc2List.Where(filter))
t.Dispose();
tc2List.RemoveAll(filter);
答案 1 :(得分:2)
我想知道以下代码是否可能会出现故障,具体取决于垃圾收集何时启动
不,它不会失败
//Its Dispose() sets a stop-condition for the thread,
//and joins the thread, awaiting it to stop. (may take 100 msek)
这是Dispose()的一个典型用法,但没有错。更有效的方法是使用不同的Stop()
,以便您可以立即停止所有线程。或者从Dispose()
致电Parallel.ForEach()
。但无论你选择何种方法,它都不会阻碍GC,也不会受到GC的阻碍。
答案 2 :(得分:1)
您有TestClass2
的最终确定方法吗?
处理主要属性
请参阅link。
答案 3 :(得分:0)
在垃圾收集方面,调用Dispose意味着什么?
调用dispose,意味着您使用Dispose方法的实现强制清理事物(字面意思是内存)。注意:(某些框架类会为您调用Dispose的实现。例如,System.Windows.Forms.Form)
对比度上的垃圾收集是.NET运行时的一项功能,它将自动为您清理内容。我自动意思是,因为它取决于内存压力以及运行时所关注的其他因素。
我推荐的简单策略。如果您认为内存会比所需内存更长并且会影响应用程序,请执行Dispose()。否则将它留给运行时,它会在超出范围时自动清理(即最终确定)对象。 GC有自己的如何进行清理的算法,但你可以在更大程度上依赖它。
下一个问题 具体来说,我想知道以下代码是否偶尔会失败,具体取决于垃圾收集何时启动
我猜不是。由于GC启动导致代码失败取决于您如何编写TestClass2的终结器。绝对是你的电话t.Dispose()不会与GC发生冲突。