C#弱引用误杀问题

原本以为传递 控件内的方法 就可以避免误杀了,结果几秒后就被清理

发现需要把方法用委托包一下,然后把委托赋值在大类中,让长寿类强引用委托就不会被清理了。

这是弱引用事件注册类

image

两种方法 问题

image

调用某些Winapi好像也有类似的问题,钩子

这里lambda表达式也是一样会被回收掉,原因是lambda编译后可能就是个类种类,然后这个对象没人强引用就被回收了。


所以传递方法名到底传进去了什么?

是一个临时变量....
image

总结

//所以想要避免误杀就要有强引用
//可以选择在注册类这边 手动强引用,然后再把这个引用对象作为参数注册给弱引用事件里。
handler=()=>{};
register(handler);

//也可以在注册方法中创建强引用在 弱引用事件中,实现自动强引用管理。
register(action act){
    this.registers.add(act);
    ...
}

/*
	手动管理好处在于 注册者 消失了的话就全部解引用了
	自动管理好处在于 把坑填了,不然手动管理忘记强引用被误杀了可能很久才能发现。但如果这个方法会被外部引用 自动管理就会很危险。
	
	总而言之 直接传递方法名=编译器创建了个临时变量传进去 导致了这个问题的出现。
*/
posted @ 2026-02-28 15:44  quxingbai  阅读(12)  评论(0)    收藏  举报