【问题标题】:C# Timer refuses to stop tickingC# Timer 拒绝停止计时
【发布时间】:2015-06-18 16:14:07
【问题描述】:

我整天在这个问题上摸不着头脑,这让我很生气,这有什么我不知道的明显问题吗?

代码如下:

private Timer _timer = null;
private EventHandler ev = null;
private void startAnimatingPicStatus()
{
     Console.WriteLine("    | STARTING ANIMATION");
     _timer = new Timer();
     _timer.Interval = 100;
     ev = new EventHandler(timer_Tick);
     _timer.Tick += ev;
     _timer.Start();
 }
 private int animationPosition = 0;
 private void timer_Tick(object sender, EventArgs e)
 {
     Console.WriteLine("    | ANIMATING ANIMATION");
     animationPosition++;
     if (animationPosition == 4) animationPosition = 1;
     Dictionary<int, Image> images = new Dictionary<int, Image>();
     images[1] = myproject.Properties.Resources.animateimage_1;
     images[2] = myproject.Properties.Resources.animateimage_2;
     images[3] = myproject.Properties.Resources.animateimage_3;

     picStatus.Image = images[animationPosition];
 }

 private void stopAnimatingPicStatusIfAnimatingAndSetToComplete()
 {
     Console.WriteLine("    | STOPPING ANIMATION");
     _timer.Tick -= ev;
     _timer.Dispose();
     picStatus.Image = nofolder.Properties.Resources.tfolderg;            
  }

这是我期望的调试:

| STARTING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| STOPPING ANIMATION

但这就是我得到的:

| STARTING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| STOPPING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION
| ANIMATING ANIMATION

好消息是它似乎确实停止了动画。坏消息是它只是有时而且它是随机的,但似乎有 50% 的时间发生 - 50% 的时间动画停止,大约 50% 的时间它只是旋转动画,即使它应该停止了

编辑>解决方案我在startAnimatingPicStatus() 中添加了if (ev != null) _timer.Tick -= ev;,就在ev = new EventHandler(timer_Tick); 行之前,这似乎已经修复了它

【问题讨论】:

  • stopAnimatingPicStatusIfAnimatingAndSetToComplete 在哪里被调用?
  • 您是否曾经多次致电startAnimatingPicStatus
  • 尝试添加 _timer.Stop();在你处理你的计时器之前。
  • 实际上,它有时会在停止之前调用startAnimatingPicStatus() 两次(这是设计使然)是否有任何防弹方法来删除所有刻度事件? @Chuck 是的,我做了,我也将它设置为 null(整个对象)它没有区别
  • 不声明_timer也不订阅Tick在start里面,而是在类构造函数中做,只在方法中调用_timer.Start(也不要再释放定时器了在停止)

标签: c# multithreading timer


【解决方案1】:

要停止计时器,您是否尝试过使用 Change 方法,就像:

myTimer.Change(Timeout.Infinite, Timeout.Infinite);

更多信息在这里:https://msdn.microsoft.com/en-us/library/yz1c7148%28v=vs.110%29.aspx

【讨论】:

  • 我做了类似的事情,我在添加if (ev != null) _timer.Tick -= ev; 之前添加了_timer.Interval = 100;,我认为它修复了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多