Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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# 需要停止计时器,因为它正在循环并一次又一次地打开同一个窗口_C# - Fatal编程技术网

C# 需要停止计时器,因为它正在循环并一次又一次地打开同一个窗口

C# 需要停止计时器,因为它正在循环并一次又一次地打开同一个窗口,c#,C#,我有一个启动时的屏幕,基本上像一个水花,但它不是。我在上面放了一个计时器。几秒钟后,窗口必须消失,然后必须显示登录。我已经展示了新的表单,但它正在循环中。它一次又一次地打开新表单!这是我的密码。我哪里做错了 计时器 int count; count = 0; public Windowsplash() { System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.Dis

我有一个启动时的屏幕,基本上像一个水花,但它不是。我在上面放了一个计时器。几秒钟后,窗口必须消失,然后必须显示登录。我已经展示了新的表单,但它正在循环中。它一次又一次地打开新表单!这是我的密码。我哪里做错了

计时器

int count;
count = 0;

public Windowsplash()
{
    System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();

    dispatcherTimer.Interval = new TimeSpan(0,0,0,0,2500);
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    System.Windows.Threading.DispatcherTimer dispatcherTimer = sender as System.Windows.Threading.DispatcherTimer;

    dispatcherTimer.Stop();
    MainWindow _new = new MainWindow();
    _new.Show();
    this.Close();
}
我想停止计时器,这样新窗口就可以停止打开整个时间! 谢谢


PS:我将其编辑为我现在拥有的内容

您正在_tickhandler中创建一个新的Dispatcher实例。然后你停止那个例子。旧的原始实例将继续运行

从处理程序中删除此行

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();

不要每次在循环中都创建一个新的
分派器
,而是重新使用原始的
分派器
。您的问题是,旧计时器在没有任何进一步交互的情况下继续运行。

要改进IvoTops应答,您可能正在创建构造函数本地的计时器,因此无法在tick处理程序中访问它。将勾号事件处理程序的第一行更改为:

System.Windows.Threading.DispatcherTimer dispatcherTimer
    = sender as System.Windows.Threading.DispatcherTimer;

通过这种方式,您可以获得触发的原始计时器,而不是创建新的计时器。

更具体地说,因为他只在计数小于5时增加计数,这意味着一旦计数达到5,它将保留在那里并继续打开新窗口。@IvoTops如果我从处理程序中删除该行,处理程序的名称没有提取dispatchtimer的名称。@user1539943使用
发送者
参数,如我的回答中所示。@Miika,在计数达到5个计数后,您如何将计数设置为零?为什么使用计数器而不是间隔2500?Kendall我如何使用Inrval?它有什么用呢。是的,我对计时器及其工作方式不太熟悉。只需在TimeSpan中指定一个2500而不是500的间隔,然后完全删除count变量。@KendallFrey因为Dispatchermer.interval=2500不工作,我能得到一些编码吗?只需将500替换为2500,并保留TimeSpan。
int count; 
count = 0; 

public Windowsplash 

    System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
    dispatcherTimer.Interval = new TimeSpan(0,0,0,500); 
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
    dispatcherTimer.Start(); 

private void dispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    System.Windows.Threading.DispatcherTimer dispatcherTimer = sender as System.Windows.Threading.DispatcherTimer; 

        dispatcherTimer.Stop(); 
        MainWindow _new = new MainWindow(); 
        _new.Show(); 
        this.Close(); 
}