如何删除匿名对象并检查它们是否仍然存在于 C# 中
How to delete anonymous objects and check if they still exist in c#
假设我有一个创建匿名对象的 for 循环,如下所示:
using System;
using System.Threading;
namespace gctest
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Hello World!");
for (int i = 0; i < 50; i++){
myObject newobject = new myObject(i);
}
}
}
class myObject{
int i;
public myObject(int i){
this.i = i;
Announcer newannouncer = new Announcer (i);
Thread newthread = new Thread (newannouncer.Start);
newthread.Start ();
}
~myObject() // destructor
{
Console.WriteLine ("=============================Object " + i + " HAS BEEN DESTROYED!=========================");
}
}
class Announcer{
int i;
public Announcer(int i){
this.i = i;
}
public void Start ()
{
while (true) {
Console.WriteLine ("OBJECT" + i + " STILL EXISTS!");
Thread.Sleep (500);
}
}
}
}
一旦 for 循环 运行,就没有任何名称可以用来引用 myObject 实例,这意味着它们未被引用,因此应该被垃圾收集,对吧?但事实并非如此。他们不断打印消息,这意味着它们仍然存在,但我无法访问或删除它们。我也没有看到从析构函数方法打印的消息,这意味着它们没有被垃圾收集。
如何删除我创建的这些匿名对象并检查它们是否不再存在?我不仅希望线程停止,因为我可以在 myObjects 中添加另一个方法来重新启动线程。我希望完全删除 myObject 实例。
编辑:经过 运行ning 12 分钟后,对象终于被垃圾回收了。迈克是对的。
公共语言运行时 (CLR) 跟踪线程,垃圾收集器不会删除它们。您需要停止线程并取消对线程对象的任何引用,然后等待垃圾收集器为您完成肮脏的工作。
您的匿名对象实际上会被垃圾回收。您无法知道它们没有被垃圾收集;您看到的消息来自您启动的线程,而不是来自您的匿名对象。
如果您想查看某些内容是否被垃圾回收,您可以执行以下两项操作之一:
简单的做法是添加一个析构函数 (~myObject()
) 并从中打印 "I am being garbage-collected!"。
最好的做法(尽管需要更多工作)是为您的对象保留 List
个 WeakReference
,并定期检查列出并查看是否有任何目标引用已变为空。
假设我有一个创建匿名对象的 for 循环,如下所示:
using System;
using System.Threading;
namespace gctest
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Hello World!");
for (int i = 0; i < 50; i++){
myObject newobject = new myObject(i);
}
}
}
class myObject{
int i;
public myObject(int i){
this.i = i;
Announcer newannouncer = new Announcer (i);
Thread newthread = new Thread (newannouncer.Start);
newthread.Start ();
}
~myObject() // destructor
{
Console.WriteLine ("=============================Object " + i + " HAS BEEN DESTROYED!=========================");
}
}
class Announcer{
int i;
public Announcer(int i){
this.i = i;
}
public void Start ()
{
while (true) {
Console.WriteLine ("OBJECT" + i + " STILL EXISTS!");
Thread.Sleep (500);
}
}
}
}
一旦 for 循环 运行,就没有任何名称可以用来引用 myObject 实例,这意味着它们未被引用,因此应该被垃圾收集,对吧?但事实并非如此。他们不断打印消息,这意味着它们仍然存在,但我无法访问或删除它们。我也没有看到从析构函数方法打印的消息,这意味着它们没有被垃圾收集。
如何删除我创建的这些匿名对象并检查它们是否不再存在?我不仅希望线程停止,因为我可以在 myObjects 中添加另一个方法来重新启动线程。我希望完全删除 myObject 实例。
编辑:经过 运行ning 12 分钟后,对象终于被垃圾回收了。迈克是对的。
公共语言运行时 (CLR) 跟踪线程,垃圾收集器不会删除它们。您需要停止线程并取消对线程对象的任何引用,然后等待垃圾收集器为您完成肮脏的工作。
您的匿名对象实际上会被垃圾回收。您无法知道它们没有被垃圾收集;您看到的消息来自您启动的线程,而不是来自您的匿名对象。
如果您想查看某些内容是否被垃圾回收,您可以执行以下两项操作之一:
简单的做法是添加一个析构函数 (
~myObject()
) 并从中打印 "I am being garbage-collected!"。最好的做法(尽管需要更多工作)是为您的对象保留
List
个WeakReference
,并定期检查列出并查看是否有任何目标引用已变为空。