如何在c#中重新启动任务?或者如何重新启动Thread.Sleep()



我一直在尝试制作一个Windows应用程序,当我(从服务器(收到消息"some_string"时,我需要将标签的颜色(代码中的sys2lbl(更改为绿色,它将保持绿色15秒,然后变为红色。然而,例如,在第5秒,如果我再次收到消息"some_string",则标签应再保持绿色15秒,即总共5+15=20。

我正在使用Task.Run((,根据我的理解,当我在这15秒内收到字符串"some_string"时,该任务将以某种方式重新启动。

注意:如果我在15秒后收到"some_string",此任务将完美运行。

有人知道怎么解决这个问题吗?

Task.Run(() => 
{
if (x.ApplicationMessage.Topic == "some_string")
{ 
sys2lbl.BackColor = Color.Green;
Thread.Sleep(15000);
sys2lbl.BackColor = Color.Red;
}
});

您可以使用System.Windows.Forms命名空间中的Timer。在您的表格中申报

private readonly Timer _timer = new Timer();

像这样初始化

public Form1()
{
InitializeComponent();
_timer.Interval = 15000; // Milliseconds
_timer.Tick += Timer_Tick;
}
private void Timer_Tick(object sender, EventArgs e)
{
_timer.Stop();
sys2lbl.BackColor = Color.Red;
}

然后您可以使用启动或重新启动计时器

private void RestartTimer()
{
_timer.Stop();
sys2lbl.BackColor = Color.Green;
_timer.Start();
}

我经常使用这种技术来延迟查询的执行。举个例子,假设我们有一个数据网格和一个用于过滤网格中数据的文本框。在文本框的TextChanged事件中,我们以短延迟(例如200ms(启动计时器。在Timer_Tick中,我们停止计时器并重新查询数据。

其优点是,用户无需点击Enter键或单击按钮即可重新查询数据。但另一方面,数据不会在每次击键后重新查询,如果查询执行缓慢,这可能会产生问题。

如果用户在计时器延迟结束之前键入下一个字符,则计时器将重新启动。如果由于用户键入速度较慢而在输入筛选器时执行查询,则会累积下一次击键,然后在数据更新完成时一次将其插入文本框。这减少了重新查询的次数,并使UI的响应能力更强。

请注意,在Windows窗体中,事件是严格按顺序执行的。新事件永远不会中断UI线程上运行的方法(可以是事件处理程序(。因此,计时器永远不会出现多线程问题。

最新更新