关于C#事件回收导致的内存泄漏
公司之前的项目有一段代码是主窗体新建子窗体,并且订阅子窗体的事件,每次打开子窗体都要订阅一次,导致打开多少次子窗体就会返回多少条信息。。。就像是下图打开过六次就一次性返回了六条信息。。。。
最后排查问题发现是因为子窗体里的事件写成了static静态类,导致窗体关闭后没有销毁事件,并且也没有任何地方是取消订阅的。。。我想复刻代码都没有成功,原来是因为我没有写静态变量。。。一般来说只要不是静态变量或者是长期拥有的变量,只要窗口被关闭,相关的事件没有任何到达路径就会被垃圾回收掉。。所以还是尽量不要使用静态变量啊!尤其是在非静态类里用。乱七八糟的
public event Action<string> returnStr;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
returnStr?.Invoke("返回一个值\r\n");
}