1

[STAThread]我有一个在 C# 中 运行的程序。

该程序定期创建类 X 的实例并将它们添加到列表中。
一段时间后,这些 X 的实例需要执行的任务都完成了,不再需要该类的实例。
由于我在单个线程上运行,并且这些 X 的许多实例可能同时运行并耗尽资源,即使它们不再需要,我想在我知道 X 的实例完成时释放资源,这样我的程序就不会变慢。

我的代码如下所示:

 public partial class Form1 : Form
 {
    List<X> myList = new List<X>();

    ...
 }

我想知道是否:

  1. 执行该操作myList.RemoveAt(0)将从内存中删除类 X 的第一个实例的所有跟踪。
  2. 如果有更好的方法来做到这一点。

谢谢!克里斯

4

2 回答 2

2

从列表中删除类不会从内存中删除它的所有痕迹。C# 是一种带有垃圾收集器的托管语言。每当不再从任何被视为“活动”的位置引用特定对象时(意味着仍然可以在代码中以某种方式访问​​该引用),它*有资格*进行垃圾收集。这仅仅意味着在未来某个不确定的时间,GC 可以自由地清理该对象的内存。可能是马上,也可能是很长时间。幸运的是,您几乎不需要担心这一点;您只需要确保一旦不再需要它们就不会持有消耗大量内存的对象的引用。

在你的情况下,你没有提供很多细节。在对 X 类一无所知的情况下,我会说它不会消耗那么多内存,而且您的列表可能没有那么大。鉴于此,只要这不是一些将持续数天的长期任务,如果它在没有被释放的情况下比它应该运行的时间长一点,这可能没什么大不了的。

如果这些对象消耗大量内存(如果它们包含大型数据库查询的结果、大型文件的内容等),那么我会问你为什么首先要有这个列表?您创建了一个类型列表,并声明它正在后台线程中使用。整个列表是否传递给后台线程?只是某些项目?如果它被传递给后台线程,那么您根本不需要在主线程中引用它(尽管您需要显示更多代码才能确定地说)。

于 2012-09-10T13:59:37.327 回答
0

不,myList.RemoveAt(0);只会从列表中删除对您的对象的引用。但是垃圾收集器 (GC) 将删除您的完整对象,因为不再有对它的引用。

如果你不使用非托管内存,只相信GC,你不知道他什么时候会准确地删除对象,但没关系,顺其自然。

如果您在类 X 中使用非托管内存(COM 对象、文件句柄等,基本上是任何具有 Dispose() 方法的东西),那么仅删除对对象的引用是不够的。在这种情况下,在您的类 X 中实现 IDisposable 接口并编写一个 Dispose 方法,该方法将调用您在 X 中使用的对象的 Dispose 方法。然后将您的代码更改为

myList[0].Dispose();
myList.RemoveAt(0);
于 2012-09-10T14:01:10.700 回答