gpt4 book ai didi

C# 计时器 (TimeSpan) 在后台持续滴答作响(if 语句在不为 true 时适用)

转载 作者:行者123 更新时间:2023-12-01 22:34:31 25 4
gpt4 key购买 nike

我正在尝试制作非常简单的计时器应用程序。我确实有一个“文本”对象,它使用以下方法将其转换为字符串后显示时间: .ToString("hh\:mm\:ss");

不幸的是,在单击整个事件重新开始的按钮后 - if 语句的执行就像计时器只是在重复自己一样(将旧的刻度和文本值保留在后台),因此 if 语句操作开始相互重叠: (.

我在应用程序中放置了名为 timer2windows.forms.timer 。我还有一个名为 Button01 的按钮和名为 Button01text1Button01textleft 的文本对象。背景颜色和计时器停止事件基于文本值比较。

旧代码(字符串使用无效):

        private void Button01_click(object sender, EventArgs e)
{

var startTime = DateTime.Now;
Button01.BackColor = Color.FromName("Green");
Button01textleft.BackColor = Color.FromName("Green");

timer2.Tick += (obj, args) =>
{
Button01text1.Text =
(TimeSpan.FromMinutes(1) - (DateTime.Now - startTime))
.ToString("hh\\:mm\\:ss");
Button01textleft.Text =
(TimeSpan.FromMinutes(1) - (DateTime.Now - startTime))
.ToString("hh\\:mm\\:ss");
if (Button01text1.Text == "00:00:30")
{
Button01.BackColor = Color.FromName("Orange");
Button01textleft.BackColor = Color.FromName("Orange");
}
else if (Button01text1.Text == "00:00:00")
{
Button01.BackColor = Color.FromName("Red");
Button01textleft.BackColor = Color.FromName("Red");
timer2.Stop();
}
};

timer2.Enabled = true;

}

新代码(同样的问题,但由于 @Dleh 进行了更新):

        public void Button01_Click(object sender, EventArgs e)
{


Timer timer1 = new System.Windows.Forms.Timer();

var startTime = DateTime.Now;
Button01text1.BackColor = Color.FromName("Green");
Button01textleft.BackColor = Color.FromName("Green");

timer1.Tick += (obj, args) =>
{
var now = DateTime.Now;
var timeDifference = (TimeSpan.FromSeconds(30) - (now - startTime));
var stringValue = timeDifference.ToString("hh\\:mm\\:ss");
Button01text1 = stringValue;
Button01textleft.Text = stringValue;
if (timeDifference <= TimeSpan.FromSeconds(15))
{
Button01text1.BackColor = Color.FromName("Orange");
Button01textleft.BackColor = Color.FromName("Orange");
}
else if (timeDifference <=TimeSpan.FromSeconds(0))
{
Button01text1.BackColor = Color.FromName("Red");
Button01textleft.BackColor = Color.FromName("Red");
timer1.Stop();
}
};
timer1.Enabled = true;

}

现在举例说明发生的情况:

我按一次按钮 - 它变成绿色,在剩下 30 秒时变成橙色,在 00 秒变成红色并停止计时器。

如果我在计数中间(40 秒时)再次按下按钮,它将变成绿色并返回到 60 秒,但会在还剩 50 秒时变为橙色(就好像上一个刻度仍在倒计时并达到 30 秒一样)如果我没有再次单击该按钮)。

我一无所知,不知道为什么会发生 - 因为它应该检查字符串文本值 - 它不应该作为单独的实例存在......

有什么想法吗?_?

发生情况的示例视频: Screen_recording

玛丽亚

最佳答案

其行为异常的原因是,每次单击该按钮时,都会向计时器添加另一个计时器滴答事件。

这段代码:

timer2.Tick += (obj, args) =>

不是简单地将事件分配给计时器滴答,而是添加事件。

如果将计时器间隔更改为 5000 并在 tick 事件中放置断点,然后单击按钮两次,那么您将看到它每 5 秒到达该断点两次。

关于C# 计时器 (TimeSpan) 在后台持续滴答作响(if 语句在不为 true 时适用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29370867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com