C#匿名委托释放问题 本帖最后由 tommir3 于 2012-02-23 10:57:49 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 想释放就别用匿名委托了,如果是委托,你可以GetInvokeList找到那个委托的引用删掉,如果事件,需要反射,何苦给自己找麻烦呢,如果需要注销的,写成方法早解决问题了,有这时间发帖等答案。囧。 执行完2(也就是执行完_demoClass.Demo方法)自然它就释放了。 谢谢大家指导,发完后自己都感觉笨了,匿名函数当然实行完后就释放了。可能是其他内存溢出问题。。常用的Timer如果是timer.Tick += new EventHandler(timer_Tick);我在构造中进行了此监听,但一直没有取消,那我void timer_Tick(object sender, EventArgs e) { // 代码 包括全局变量集合数组 }这个方法里的代码是不是也不会得到释放? 什么跟什么,匿名只是个语法。匿名函数的写法,最终都是和完整写法一样的创建委托对象,委托对象关联函数,只是方便书写的语法糖,方法怎么会释放?方法就是方法,一直存在,指向方法的委托对象,new之后,指向委托的引用没释放,委托就不符合垃圾回收规则,不会释放,你这是个例子,就事论事不合适。 按照你的写法,也是完全不需要取消timer_Tick!只有当你把某个对象的某个方法注册给其它对象(宿主),而宿主没有释放时你却要动态取消这个对象,那么才需要取消事件注册。如果宿主释放掉了,那么其事件中与其它对象之间的关联也就释放掉了,因此其它对象根本无需去取消。 通常所谓的“事件溢出”出现在向通讯网关、主窗口、你的底层的网关(例如用于处理DB操作的对象)注册事件处理程序的地方。你可以在怀疑有事件溢出的地方,使用一条Debug.WriteLine语句输出程序执行方法和参数,然后看看某些特定操作的前后是否打印出有异常、明显太多的输出。 谢谢sp1234,我去试试看去。其实程序不大,昨天测了下,连续运行6个半小时,内存涨了45M....我用了很多的匿名方法,就像开始写的那种匿名回调方法。还有一些Timer咳~ 这玩意,还是自己一个一个看看吧。 Socket.LingerState引发SocketException类型异常 请问如何判断两个bool值要么同时为true,要么同时为false的最简方法 C# 如何双击richtextbox选中某一行 savefiledialog 问题 3层开发的真正好处在哪里? XML这个文件在SQL2005中怎么不能测试输出数据呀? Excel文档输出到C#后,数据项都为空了 页面style问题 散分,终于体会到"interface"的好处了. DataGrid的问题 急!快帮忙~~~ C#位操作的问题.菜鸟求解.急急急.. Ado.net 的getordinal()函数的问题
匿名函数当然实行完后就释放了。可能是其他内存溢出问题。。
常用的Timer
如果是timer.Tick += new EventHandler(timer_Tick);
我在构造中进行了此监听,但一直没有取消,
那我void timer_Tick(object sender, EventArgs e)
{
// 代码 包括全局变量集合数组
}这个方法里的代码是不是也不会得到释放?
按照你的写法,也是完全不需要取消timer_Tick!只有当你把某个对象的某个方法注册给其它对象(宿主),而宿主没有释放时你却要动态取消这个对象,那么才需要取消事件注册。如果宿主释放掉了,那么其事件中与其它对象之间的关联也就释放掉了,因此其它对象根本无需去取消。
其实程序不大,昨天测了下,连续运行6个半小时,内存涨了45M....
我用了很多的匿名方法,就像开始写的那种匿名回调方法。
还有一些Timer
咳~ 这玩意,还是自己一个一个看看吧。