无法正确重启我的 DispatcherTimer
Unable to correctly restart my DispatcherTimer
我正在尝试在我的应用程序中使用三个按钮 - 开始、停止和重新启动来实现计时器。
计时器启动和停止正常。但是,当我单击重新启动按钮时,它从先前的秒和分钟值开始,而不是从 0 和 0 开始。我看不出我在做什么错,因为我在开始时将秒和分钟设置为 0重启方法本身。
例如:第一次从 0 开始,然后继续到 1、2、3。在 3 停止。当我重新启动时,它从 2 开始,继续到 4、6...如果我再次重新启动,它将开始在 3 点继续到 6、9、12...
下面是我的代码:
public int seconds;
public int minutes;
public int hours;
System.Windows.Threading.DispatcherTimer myTimer = new System.Windows.Threading.DispatcherTimer();
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Stop();
}
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
private void Each_Tick(object o, EventArgs sender)
{
seconds = seconds + 1;
if (seconds < 10 && minutes < 10)
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else if (seconds > 59)
{
minutes = minutes + 1;
seconds = 0;
seconds = seconds + 1;
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
}
任何帮助将不胜感激。
由于计时器未重置,请执行以下操作:
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer = new System.Windows.Threading.DispatcherTimer();
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
// put myTimer.Stop() in Restart Method
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer.Stop(); // stop timmer here and try
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
您的程序永远无法按预期运行!
每次单击开始按钮时,您都会向 Dispatchertimer 添加一个 Tickhandler,这样您的秒数就会开始递增 2,然后递增 3,依此类推。
您必须在停止和重新启动方法中删除处理程序!!!
然后一切都按预期工作,您不必在每次重新启动时创建新的 DispatcherTimer。顺便说一下,@DeshDeep Singh 的解决方案从不收集旧的 DispatcherTimer,因为 EventHandler 阻止它被收集 - 所以他的解决方案给你带来了很大的内存问题。
这是工作代码:
public int seconds;
public int minutes;
public int hours;
System.Windows.Threading.DispatcherTimer myTimer = new System.Windows.Threading.DispatcherTimer();
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += Each_Tick;
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Tick -= Each_Tick;
myTimer.Stop();
}
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer.Tick -= Each_Tick;
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
private void Each_Tick(object sender, EventArgs e)
{
seconds = seconds + 1;
if (seconds < 10 && minutes < 10)
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else if (seconds > 59)
{
minutes = minutes + 1;
seconds = 0;
seconds = seconds + 1;
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
}
您只需附加 Tick
处理程序 一次:
private int seconds;
private int minutes;
private int hours;
private DispatcherTimer myTimer = new DispatcherTimer();
private void Initialize()
{
myTimer.Interval = TimeSpan.FromMilliseconds(1000);
myTimer.Tick += Each_Tick;
}
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Stop();
}
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer.Stop();
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Start();
}
private void Each_Tick(object o, EventArgs sender)
{
...
}
更简单的解决方案是您只需要启动和停止,而无需重新启动:
private int seconds;
private int minutes;
private int hours;
private DispatcherTimer myTimer = new DispatcherTimer();
private void Initialize()
{
myTimer.Interval = TimeSpan.FromMilliseconds(1000);
myTimer.Tick += Each_Tick;
}
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Stop();
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Stop();
}
private void Each_Tick(object o, EventArgs sender)
{
...
}
我正在尝试在我的应用程序中使用三个按钮 - 开始、停止和重新启动来实现计时器。
计时器启动和停止正常。但是,当我单击重新启动按钮时,它从先前的秒和分钟值开始,而不是从 0 和 0 开始。我看不出我在做什么错,因为我在开始时将秒和分钟设置为 0重启方法本身。
例如:第一次从 0 开始,然后继续到 1、2、3。在 3 停止。当我重新启动时,它从 2 开始,继续到 4、6...如果我再次重新启动,它将开始在 3 点继续到 6、9、12...
下面是我的代码:
public int seconds;
public int minutes;
public int hours;
System.Windows.Threading.DispatcherTimer myTimer = new System.Windows.Threading.DispatcherTimer();
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Stop();
}
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
private void Each_Tick(object o, EventArgs sender)
{
seconds = seconds + 1;
if (seconds < 10 && minutes < 10)
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else if (seconds > 59)
{
minutes = minutes + 1;
seconds = 0;
seconds = seconds + 1;
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
}
任何帮助将不胜感激。
由于计时器未重置,请执行以下操作:
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer = new System.Windows.Threading.DispatcherTimer();
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
// put myTimer.Stop() in Restart Method
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer.Stop(); // stop timmer here and try
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
您的程序永远无法按预期运行! 每次单击开始按钮时,您都会向 Dispatchertimer 添加一个 Tickhandler,这样您的秒数就会开始递增 2,然后递增 3,依此类推。 您必须在停止和重新启动方法中删除处理程序!!! 然后一切都按预期工作,您不必在每次重新启动时创建新的 DispatcherTimer。顺便说一下,@DeshDeep Singh 的解决方案从不收集旧的 DispatcherTimer,因为 EventHandler 阻止它被收集 - 所以他的解决方案给你带来了很大的内存问题。
这是工作代码:
public int seconds;
public int minutes;
public int hours;
System.Windows.Threading.DispatcherTimer myTimer = new System.Windows.Threading.DispatcherTimer();
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += Each_Tick;
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Tick -= Each_Tick;
myTimer.Stop();
}
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer.Tick -= Each_Tick;
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
myTimer.Tick += new EventHandler(Each_Tick);
myTimer.Start();
}
private void Each_Tick(object sender, EventArgs e)
{
seconds = seconds + 1;
if (seconds < 10 && minutes < 10)
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else if (seconds > 59)
{
minutes = minutes + 1;
seconds = 0;
seconds = seconds + 1;
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
else
{
Timertext.Text = minutes.ToString() + " minutes : " + seconds.ToString() + " seconds";
}
}
您只需附加 Tick
处理程序 一次:
private int seconds;
private int minutes;
private int hours;
private DispatcherTimer myTimer = new DispatcherTimer();
private void Initialize()
{
myTimer.Interval = TimeSpan.FromMilliseconds(1000);
myTimer.Tick += Each_Tick;
}
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Stop();
}
private void Tick_Timer_Restart(object sender, RoutedEventArgs e)
{
myTimer.Stop();
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Start();
}
private void Each_Tick(object o, EventArgs sender)
{
...
}
更简单的解决方案是您只需要启动和停止,而无需重新启动:
private int seconds;
private int minutes;
private int hours;
private DispatcherTimer myTimer = new DispatcherTimer();
private void Initialize()
{
myTimer.Interval = TimeSpan.FromMilliseconds(1000);
myTimer.Tick += Each_Tick;
}
private void Tick_Timer_Start(object sender, RoutedEventArgs e)
{
myTimer.Stop();
seconds = 0;
minutes = 0;
Timertext.Text = "0 minutes : 0 seconds";
myTimer.Start();
}
private void Tick_Timer_Stop(object sender, RoutedEventArgs e)
{
myTimer.Stop();
}
private void Each_Tick(object o, EventArgs sender)
{
...
}