如何停止程序一段时间没有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秒?

如何停止程序一段时间没有System.Threading.Thread.Sleep.c#

没有一个好的,最小的完整的代码示例来清楚地说明您的场景,很难确定您想要做什么。

但是,在我看来,你真正想要的是执行工作而不是在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秒后才重新启用。我已经更新了上面的代码示例来完成这个任务。