3

我对 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

4 回答 4

4

你的代码有效,但它的风格很糟糕。谓词不应该有副作用。所以你应该首先处理元素,然后删除它们。

Predicate<T> filter = t => t.Name == "Orange";
foreach(var t in tc2List.Where(filter))
  t.Dispose();
tc2List.RemoveAll(filter);
于 2013-01-25T10:28:28.280 回答
2

i wonder if the following code may fail occationally, depending on when the garbage collection kicks in

No, it won't fail

//Its Dispose() sets a stop-condition for the thread,
//and joins the thread, awaiting it to stop. (may take 100 msek)

That is a slightly a-typical use of Dispose() but not wrong. A more efficient approach would use a different Stop() so that you can stop all threads at once. Or call Dispose() from Parallel.ForEach(). But whatever method you choose, it is not hindering, nor is it being hindered by, the GC.

于 2013-01-25T10:17:19.133 回答
1

你有 finalize 方法TestClass2吗?

处理主要属性

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

请参阅链接

于 2013-01-25T10:22:10.887 回答
0

就垃圾收集而言,调用 Dispose 意味着什么?

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

相比之下,垃圾收集是 .NET 运行时的一项功能,它会自动为您清理东西。我的意思是自动的,因为它取决于运行时处理的内存压力和其他因素。

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

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

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

于 2013-01-25T10:38:58.140 回答