Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法正确重新启动我的Dispatcher_C#_Wpf_Dispatchertimer - Fatal编程技术网

C# 无法正确重新启动我的Dispatcher

C# 无法正确重新启动我的Dispatcher,c#,wpf,dispatchertimer,C#,Wpf,Dispatchertimer,我试图在我的应用程序中实现一个计时器,它有三个按钮:开始、停止和重新启动 计时器正常启动和停止。但是,当我单击“重新启动”按钮时,它将从以前的秒和分钟值开始,而不是从0和0开始。我看不出我做错了什么,因为我在重新启动方法本身的开始部分将秒和分钟设置为0 第一次从0开始,一直到1,2,3。3点停车。当我重新启动时,它从2开始,然后继续到4,6。。。如果我重新启动,它从3开始,然后继续到6,9,12 下面是我的代码: public int seconds; public int mi

我试图在我的应用程序中实现一个计时器,它有三个按钮:开始、停止和重新启动

计时器正常启动和停止。但是,当我单击“重新启动”按钮时,它将从以前的秒和分钟值开始,而不是从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";
        }
    }
public int秒;
公开会议记录;
公共时间;
System.Windows.Threading.DispatcherTimer myTimer=新的System.Windows.Threading.DispatcherTimer();
私有无效勾号\u计时器\u启动(对象发送器、路由目标)
{
myTimer.Interval=新的时间跨度(0,0,0,0,1000);
myTimer.Tick+=新事件处理程序(每个Tick);
myTimer.Start();
}
私有无效勾号\u计时器\u停止(对象发送器,路由目标)
{
myTimer.Stop();
}
私有无效勾号\u计时器\u重新启动(对象发送器,路由目标)
{
秒=0;
分钟=0;
Timertext.Text=“0分钟:0秒”;
myTimer.Interval=新的时间跨度(0,0,0,0,1000);
myTimer.Tick+=新事件处理程序(每个Tick);
myTimer.Start();
}
私有无效每个勾号(对象o、事件参数发送者)
{
秒=秒+1;
如果(秒<10和分钟<10)
{
Timertext.Text=minutes.ToString()+“minutes:”+seconds.ToString()+“seconds”;
}
否则,如果(秒>59)
{
分钟=分钟+1;
秒=0;
秒=秒+1;
Timertext.Text=minutes.ToString()+“minutes:”+seconds.ToString()+“seconds”;
}
其他的
{
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();

    }

你的程序永远不会按预期工作! 每次单击开始按钮时,您都会向Dispatchermer添加一个Tickhandler,这样您的秒数开始增加2,然后增加3,依此类推。 您必须删除停止和重新启动方法中的处理程序!!! 然后一切都按预期工作,您不必在每次重新启动时创建新的Dispatchermer。顺便说一下,@DeshDeep Singh的解决方案从不收集旧的Dispatchermer,因为EventHandler阻止收集旧的Dispatchermer,所以他的解决方案会给您带来一个大内存问题

以下是工作代码:

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";
    }
}
public int秒;
公开会议记录;
公共时间;
System.Windows.Threading.DispatcherTimer myTimer=新的System.Windows.Threading.DispatcherTimer();
私有无效勾号\u计时器\u启动(对象发送器、路由目标)
{
myTimer.Interval=新的时间跨度(0,0,0,0,1000);
myTimer.Tick+=每个_Tick;
myTimer.Start();
}
私有无效勾号\u计时器\u停止(对象发送器,路由目标)
{
myTimer.Tick-=每个_Tick;
myTimer.Stop();
}
私有无效勾号\u计时器\u重新启动(对象发送器,路由目标)
{
myTimer.Tick-=每个_Tick;
秒=0;
分钟=0;
Timertext.Text=“0分钟:0秒”;
myTimer.Interval=新的时间跨度(0,0,0,0,1000);
myTimer.Tick+=新事件处理程序(每个Tick);
myTimer.Start();
}
私有无效每个勾号(对象发送方、事件参数)
{
秒=秒+1;
如果(秒<10和分钟<10)
{
Timertext.Text=minutes.ToString()+“minutes:”+seconds.ToString()+“seconds”;
}
否则,如果(秒>59)
{
分钟=分钟+1;
秒=0;
秒=秒+1;
Timertext.Text=minutes.ToString()+“minutes:”+seconds.ToString()+“seconds”;
}
其他的
{
Timertext.Text=minutes.ToString()+“minutes:”+seconds.ToString()+“seconds”;
}
}

您只需将
勾选符
处理程序连接一次

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,您可以按自己的方式使用。秒和分钟的值与Dispatcher无关,因此,创建Dispatchermer的新实例不会重置秒和分钟的值!您的解决方案会导致内存问题,因为您从未从旧的Dispatchermer中删除TickHandler,所以它会挂起在内存中。在这里完全没有必要创建新的计时器-请参阅我的解决方案@纳兹-如果你改变正确的答案,我将不胜感激。这不起作用,它仍然和以前一样。上面的答案解决了我的问题。好的。。。myTimer.Tick-=新事件处理程序(每个Tick);此外,您还可以使用remove event..每次都不必删除并重新连接勾号处理程序,因为它是相同的方法。只需在第一次开始之前添加一次,然后再也不要更改它。是的,那更好!你说得对,谢谢你和@Clemens的回答。我意识到以前的解决方案并没有解决我的问题,问题是每次重启时都要添加一个新的Tick处理程序。只需删除行
myTimer.Tick+=neweventhandler(每个_Tick)
勾选计时器\u重新启动
。你接受的答案并不能说明解决问题的正确方法。
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)
{
    ...
}