如何停止程序一段时间没有System.Threading.Thread.Sleep.c#
本文关键字:Threading Thread Sleep System 何停止 程序 一段时间 | 更新日期: 2023-09-27 18:01:54
System.Threading.Thread.Sleep
是很好的停止时间应用程序,但它不工作,因为我需要。
这是我的代码:
buttonShip.Enabled = false;
Saving();
SetProperties();
Loading();
ShowLabels();
System.Threading.Thread.Sleep(3000);
buttonShip.Enabled = true;
我可以在第一次点击后立即点击buttonShip当程序显示按钮为Disabled时,它实际上是Enabled。
我的问题是,如何让程序停止3秒?
没有一个好的,最小的, 完整的代码示例来清楚地说明您的场景,很难确定您想要做什么。
但是,在我看来,你真正想要的是执行工作而不是在UI线程中。这将允许用户看到按钮的Enabled
状态的变化,并允许UI的其余部分在工作发生时保持响应。
实现这一目标的基本方法是修改代码,使其看起来更像这样:
async void buttonShip_Click(object sender, EventArgs e)
{
buttonShip.Enabled = false;
await Task.Run(() =>
{
Saving();
SetProperties();
Loading();
ShowLabels();
}
// Wait for three more seconds before re-enabling the button:
await Task.Delay(3000);
buttonShip.Enabled = true;
}
这将导致所有其他代码在与UI线程不同的线程中执行。当任务启动时,buttonShip_Click()
方法实际上将返回,而无需执行最后一条语句。任务中的语句将在不同的线程中执行。当任务完成后,控制权将返回到buttonShip.Click()
方法;它将在紧接await
语句的语句处开始执行,即重新启用按钮的语句。
不幸的是,您的原始代码示例非常模糊。有一种可能性是,至少任务中的一些工作也应该更新UI。如果是这种情况,那么有很多方法可以实现这一点,包括简单地使用Control.Invoke()
在它所属的UI线程上执行与UI相关的代码,或者使用Progress<T>
类通过IProgress<T>
接口完成相同的操作。
如果你想要更多关于这些方面的建议,我建议你尝试上面的方法,研究可能出现的其他问题(如果有的话),如果你无法解决它们,发布一个关于这些新问题的新问题,确保包括一个好的代码示例。
编辑:
根据你上面的评论,这里引用:
程序可以执行100毫秒,在这种情况下,按钮必须在100毫秒的3秒后激活。如果程序执行5秒,在这种情况下,按钮必须在8秒后激活
我的理解是,无论执行其他任务需要多长时间,您都希望按钮在3秒后才重新启用。我已经更新了上面的代码示例来完成这个任务。