日期:2014-05-18 浏览次数:21307 次
using System;
using System.Windows.Forms;
namespace GCTest
{
class Program
{
static void Main(string[] args)
{
B b = new B();
}
}
public class B
{
~B()//析构函数,垃圾回收时调用,这意味着对继承链中的所有实例递归地调用 Finalize 方法
{
MessageBox.Show("我销毁了啊,你别拦住我");
}
}
}
------解决方案--------------------
给回收添加通知:
using System;
using System.Windows.Forms;
namespace GCTest
{
public delegate void GCEventHandler();
class Program
{
static void Main(string[] args)
{
B b = new B();
b.disposeHandler += new GCEventHandler(b_disposeHandler);
}
static void b_disposeHandler()
{
MessageBox.Show("正在回收B");
}
}
public class B
{
public event GCEventHandler disposeHandler;
public B()
{
disposeHandler += new GCEventHandler(OnGC);
}
~B()//析构函数,垃圾回收时调用
{
disposeHandler();
}
void OnGC()
{
Console.WriteLine("GCEventHandler was called");
}
}
------解决方案--------------------
自己写一个吧。
楼主我就缺分,能碰见你太好了,感觉找到党了!
using System;
namespace GC_Event
{
// 定义事件委托
public delegate void ActionEventHandler(object sender, MyEventArgs e);
// 定义事件参数
public class MyEventArgs : EventArgs
{
// 根据你的实际需要添加变量
public int Count = 0;
// 这个一定要保留,它是开关,控制 GC 是否引发用户事件
public bool Stop = true;
}
// 给类起名叫"烈士",我真是太有才了!
public class Martyr
{
// 静态事件参数变量,通过它存储你要传达给事件的信息
public static MyEventArgs e = new MyEventArgs();
// 生成事件变量,也是静态的,存储你让事件引发的方法集合
public static event ActionEventHandler Action = null;
// 启动对 GC 的跟踪
public static void Start()
{
// 有 e 被用户定义为 null 的可能性,代码写强壮点吧
if (Martyr.e != null && Martyr.e.Stop == true)
{
// 把控制无限循环开关打开,不间断的跟踪 GC
Martyr.e.Stop = false;
// 生成一个动态对象,然后直接抛弃,等着GC来回收
// 从这点上来说,这个动态对象绝对是烈士
new Martyr();
}
}
// 停止对 GC 的跟踪
public static void Stop()
{
// 把开关关闭,下次垃圾回收就不会触发事件,并停止循环,这个烈士真正的安息了
if (Martyr.e != null)
Martyr.e.Stop = true;
}
// 析构器,本方法的核心
// GC只要一工作,就一定会来执行不存在引用的对象的析构器,算是遗体告别仪式吧
// 我不是不尊敬烈士昂,只不过这个词比较容易让人理解
~Martyr()
{
// 如果开关不存在了,或者开关关闭,就老老实实地回收,结束
if (Martyr.e != null)
if (!Martyr.e.Stop)
{
// 如果开关开着,就触发事件,同样代码写强壮一点,不执行空事件
if (Martyr.Action != null)
OnAction();
// 革命尚未成功,同志仍须努力
// 倒下我一个,还有后来人
// 再制造个烈士躺那,跟踪下一次 GC 的动作
new Martyr();
}
}
// 触发事件
private void OnAction()
{
// 告诉方法是烈士在调用它,虽然躺那了,精神还在,this关键字仍然指向本体
// 参数 e 用那个静态的, e 也算是包罗万象了
Martyr.Action(this, Martyr.e);
}
}
class Program
{
static void Main(string[] args)
{
// 把自己的方法传给烈士要执行的事件
Martyr.Action += new ActionEventHandler(Program.Process);
// 启动对 GC 的跟踪
Martyr.Start();
// 人为制造垃圾回收
for (int i = 0; i < 100; i++)
{
Martyr.e.Count++;
int[] j = new int[1000000];
GC.Col