在list.removeAll中调用dispose

时间:2013-01-25 10:13:00

标签: c# garbage-collection dispose removeall

我对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;
});

4 个答案:

答案 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的最终确定方法吗?

处理主要属性

  1. 这必须在实现IDispose接口的类中实现。
  2. 它是释放非托管资源(如文件,句柄和连接等)的正确位置。
  3. Dispose()方法在代码本身中显式调用。
  4. 在“使用”
  5. 中使用时,自动调用Dispose()方法(对于实现IDispose的对象)

    请参阅link

答案 3 :(得分:0)

在垃圾收集方面,调用Dispose意味着什么?

调用dispose,意味着您使用Dispose方法的实现强制清理事物(字面意思是内存)。注意:(某些框架类会为您调用Dispose的实现。例如,System.Windows.Forms.Form)

对比度上的垃圾收集是.NET运行时的一项功能,它将自动为您清理内容。我自动意思是,因为它取决于内存压力以及运行时所关注的其他因素。

我推荐的简单策略。如果您认为内存会比所需内存更长并且会影响应用程序,请执行Dispose()。否则将它留给运行时,它会在超出范围时自动清理(即最终确定)对象。 GC有自己的如何进行清理的算法,但你可以在更大程度上依赖它。

下一个问题 具体来说,我想知道以下代码是否偶尔会失败,具体取决于垃圾收集何时启动

我猜不是。由于GC启动导致代码失败取决于您如何编写TestClass2的终结器。绝对是你的电话t.Dispose()不会与GC发生冲突。