C#弱引用误杀问题
原本以为传递 控件内的方法 就可以避免误杀了,结果几秒后就被清理了
发现需要把方法用委托包一下,然后把委托赋值在大类中,让长寿类强引用委托就不会被清理了。
这是弱引用事件注册类

两种方法 问题

调用某些Winapi好像也有类似的问题,钩子
这里lambda表达式也是一样会被回收掉,原因是lambda编译后可能就是个类种类,然后这个对象没人强引用就被回收了。
所以传递方法名到底传进去了什么?
是一个临时变量....

总结
//所以想要避免误杀就要有强引用
//可以选择在注册类这边 手动强引用,然后再把这个引用对象作为参数注册给弱引用事件里。
handler=()=>{};
register(handler);
//也可以在注册方法中创建强引用在 弱引用事件中,实现自动强引用管理。
register(action act){
this.registers.add(act);
...
}
/*
手动管理好处在于 注册者 消失了的话就全部解引用了
自动管理好处在于 把坑填了,不然手动管理忘记强引用被误杀了可能很久才能发现。但如果这个方法会被外部引用 自动管理就会很危险。
总而言之 直接传递方法名=编译器创建了个临时变量传进去 导致了这个问题的出现。
*/

浙公网安备 33010602011771号