【发布时间】: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