Timer Tick 取消事件无效

今天有朋友遇到了,Timer Tick取消事件无效的问题。

归根结底还是使用了匿名函数。

两个相同的匿名函数,其实指向的引用不一样。

这就好比 

Model m1=new Model();

m1=new Model();  

这两个Model 就不一样了。不是同一个对象。

正确方法如下:将事件赋值,这样就能找到同一个引用对象。

而不是匿名函数。

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
        public EventHandler eve;
        private void Form1_Load(object sender, EventArgs e)
        {
            eve = new System.EventHandler((aa, ee) => Tick(aa, ee, "111"));
            t.Interval = 3000;
            t.Tick += eve;
            t.Start();    //3秒弹一次111
        }
 
        private void Tick(object sender, EventArgs e, string str)
        {
            MessageBox.Show(str);
        }
 
        private async void button1_Click(object sender, EventArgs e)
        {
            t.Stop();
            t.Tick -= eve;
            t.Start();    //检查是否还会弹框111
        }

这里就顺便,贴一下匿名函数的方法:

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
        private void Form1_Load(object sender, EventArgs e)
        {
            t.Interval = 3000;
            t.Tick += (s, ev) => Tick(s, ev, "111");
            t.Start();
        }
 
        private void Tick(object sender, EventArgs e, string str)
        {
            MessageBox.Show(str);
        }
原文地址:https://www.cnblogs.com/hanjun0612/p/14080927.html