C#消息框在计时器中反复弹出

本文关键字:计时器 消息 | 更新日期: 2023-09-27 18:20:28

其他人也有和我类似的问题;但他们实际上并没有得到一个有效的答案。我可以通过创建一个bool并在它进入if语句后将其设置为false来实现这一点。我以前用过这种方法,但是,我想知道是否有更干净的方法。

问题: 为什么当我在计时器中使用带有简单OK按钮的消息框时,必须有人单击OK;否则你每秒钟都会收到同样的信息?在下面的代码中;它每隔一秒钟就会弹出一次,因为这就是计时器的设置(按一秒钟打勾),但当计时器达到10时,它应该只显示一次,就像下面的代码一样,但计时器应该仍然"打勾",因为它显示在标签中

在有人把我撕成碎片之前,我注意到人们出于某种原因喜欢在这里这样做;我的逻辑是,由于秒=10,它应该显示一次。当秒=11时,它显示一个额外的框是没有意义的,因为它是11而不是10。我也想知道是什么原因造成的?

private void randomtimer_Tick(object sender, EventArgs e)
    {
        if (seconds == 10)
        {
            MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
        }
        seconds++;            
        if (seconds >= 60)
        {
            seconds = 0;
            minutes = minutes + 1;  
        }
        if (minutes >= 60)
        {
            minutes = 0;
            hours = hours + 1;
        }
        string niceTime = string.Format("{0:D2}h:{1:D2}m:{2:D2}s", hours, minutes, seconds); //format the time so it displays nicely
        label2.Text = "Session Length:'n" + niceTime;
    }

C#消息框在计时器中反复弹出

简单的答案是,因为在MessageBox.Show()之后才递增seconds。在if (seconds == 10)测试之前移动它,您的代码就会工作。

执行流在MessageBox.Show()处停止,然后触发另一个Time事件。当涉及到计时器时,您必须始终小心重新进入。

必须有人点击OK;否则你每秒钟都会收到同样的信息

现在,这是你的问题。再看一遍代码:

if (seconds == 10)
{
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
seconds++;

直到MessageBox.Show被解除后,秒数才会增加。更改为:

if (seconds == 10)
{
    seconds++;
    MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
else seconds++;

这样就能解决你的问题。

我会尽量简单地解释这一点,所以请耐心等待

当调用计时器的处理程序时,计数器将不会被阻塞。您提供的函数每秒钟(计时器的间隔)运行一次。现在,当您显示MessageBox时,计时器处理程序的线程会被阻塞。因此,增加秒数的代码将不会运行,直到用户单击OK并恢复函数。

现在,如果用户不按OK,第二个将停留在10。1秒后,计时器将再次调用处理程序,并且if将运行,因为值仍为10。

如果你想防止这种情况发生,可以使用这样的代码:

        if (seconds == 10)
        {
            seconds++;
            MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
        }
        else
            seconds++;

当然还有更好的方法,但这会奏效的。