c# - 无法正确重启我的 DispatcherTimer

标签 c# wpf 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";
        }
    }

任何帮助将不胜感激。

最佳答案

您的程序永远不会按预期运行! 每次单击开始按钮时,您都会向 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";
    }
}

关于c# - 无法正确重启我的 DispatcherTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31739267/

相关文章:

c# - 无法在 Azure CLI 中为应用程序设置 key 保管库的访问策略

c# - 如何在前端外部触发 SignalR 命令

.net - Wpf 用户控件和 MVVM

c# - 修改 ObservableCollection 的一项

c# - 在自己的匿名 Tick 事件处理程序中停止 DispatcherTimer

c# - 如何使 WPF 中的 DispatcherTimer 事件更顺畅?

.net - 一个应用程序中有更多 DispatcherTimers

c# - 如何将连字符与正则表达式匹配?

c# - 检查 HtmlString 在 C# 中是否为空格

wpf - 获取 ListView wpf中的选定项目