今天有朋友遇到了,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); }