本帖最后由 tommir3 于 2012-02-23 10:57:49 编辑

解决方案 »

  1.   

    想释放就别用匿名委托了,如果是委托,你可以GetInvokeList找到那个委托的引用删掉,如果事件,需要反射,何苦给自己找麻烦呢,如果需要注销的,写成方法早解决问题了,有这时间发帖等答案。囧。
      

  2.   

    执行完2(也就是执行完_demoClass.Demo方法)自然它就释放了。
      

  3.   

    谢谢大家指导,发完后自己都感觉笨了,
    匿名函数当然实行完后就释放了。可能是其他内存溢出问题。。
    常用的Timer
    如果是timer.Tick += new EventHandler(timer_Tick);
    我在构造中进行了此监听,但一直没有取消,
    那我void timer_Tick(object sender, EventArgs e)
            {
                // 代码 包括全局变量集合数组
            }这个方法里的代码是不是也不会得到释放?
      

  4.   

    什么跟什么,匿名只是个语法。匿名函数的写法,最终都是和完整写法一样的创建委托对象,委托对象关联函数,只是方便书写的语法糖,方法怎么会释放?方法就是方法,一直存在,指向方法的委托对象,new之后,指向委托的引用没释放,委托就不符合垃圾回收规则,不会释放,你这是个例子,就事论事不合适。
      

  5.   


    按照你的写法,也是完全不需要取消timer_Tick!只有当你把某个对象的某个方法注册给其它对象(宿主),而宿主没有释放时你却要动态取消这个对象,那么才需要取消事件注册。如果宿主释放掉了,那么其事件中与其它对象之间的关联也就释放掉了,因此其它对象根本无需去取消。
      

  6.   

    通常所谓的“事件溢出”出现在向通讯网关、主窗口、你的底层的网关(例如用于处理DB操作的对象)注册事件处理程序的地方。你可以在怀疑有事件溢出的地方,使用一条Debug.WriteLine语句输出程序执行方法和参数,然后看看某些特定操作的前后是否打印出有异常、明显太多的输出。
      

  7.   

    谢谢sp1234,我去试试看去。
    其实程序不大,昨天测了下,连续运行6个半小时,内存涨了45M....
    我用了很多的匿名方法,就像开始写的那种匿名回调方法。
    还有一些Timer
    咳~ 这玩意,还是自己一个一个看看吧。