关于C#事件回收导致的内存泄漏

公司之前的项目有一段代码是主窗体新建子窗体,并且订阅子窗体的事件,每次打开子窗体都要订阅一次,导致打开多少次子窗体就会返回多少条信息。。。就像是下图打开过六次就一次性返回了六条信息。。。。
ca22ac333b232fa8c20a9a62c6bad887
最后排查问题发现是因为子窗体里的事件写成了static静态类,导致窗体关闭后没有销毁事件,并且也没有任何地方是取消订阅的。。。我想复刻代码都没有成功,原来是因为我没有写静态变量。。。一般来说只要不是静态变量或者是长期拥有的变量,只要窗口被关闭,相关的事件没有任何到达路径就会被垃圾回收掉。。所以还是尽量不要使用静态变量啊!尤其是在非静态类里用。乱七八糟的

        public event Action<string> returnStr;
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            returnStr?.Invoke("返回一个值\r\n");
        }

posted @ 2025-08-01 19:02  悲伤的攻城狮  阅读(14)  评论(0)    收藏  举报