Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有System.Threading.Thread.Sleep的情况下停止程序一段时间。c#?_C# - Fatal编程技术网

如何在没有System.Threading.Thread.Sleep的情况下停止程序一段时间。c#?

如何在没有System.Threading.Thread.Sleep的情况下停止程序一段时间。c#?,c#,C#,System.Threading.Thread.Sleep适用于停止时间应用程序,但它不能按我的需要工作 这是我的代码: buttonShip.Enabled = false; Saving(); SetProperties(); Loading(); ShowLabels(); System.Threading.Thread.Sleep(3000); buttonShip.Enabled = true; 我可以在第一次单击后立即单击按钮。当程序显示按钮被禁用时,它实际上被启用 我的问题是,我

System.Threading.Thread.Sleep
适用于停止时间应用程序,但它不能按我的需要工作

这是我的代码:

buttonShip.Enabled = false;
Saving();
SetProperties();
Loading();
ShowLabels();
System.Threading.Thread.Sleep(3000);
buttonShip.Enabled = true;
我可以在第一次单击后立即单击按钮。当程序显示按钮被禁用时,它实际上被启用

我的问题是,我怎么能让程序停止3秒钟呢?

如果没有清楚地说明您的场景,就很难确定您想要做什么

但是,在我看来,您真正想要的是执行工作,而不是在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\u Click()
方法实际上会返回,而不会执行最后一条语句。任务中的语句将在不同的线程中执行。任务完成后,控件将返回到
按钮提示。单击()
方法;它将在
await
语句之后的语句(即重新启用按钮的语句)处开始执行

不幸的是,您的原始代码示例非常模糊。有一种可能性,任务中的至少一些工作也应该更新UI。如果是这样的话,那么有一些方法可以实现这一点,包括简单地使用
Control.Invoke()
在它所属的UI线程上执行与UI相关的代码,或者使用
Progress
类通过
IProgress
接口来完成相同的操作

如果您需要更多关于这些方面的建议,我建议您尝试上述方法,研究可能出现的其他问题(如果有),如果您无法解决这些问题,请发布有关这些新问题的新问题,确保包含一个好的代码示例


编辑:

根据您的上述评论,此处引用:

程序可以执行100毫秒,在这种情况下,按钮必须在100毫秒的3秒后激活。如果程序执行5秒,在这种情况下,按钮必须在8秒后激活


我的理解是,无论执行另一个任务需要多长时间,您都希望在3秒钟后才能重新启用该按钮。我已经更新了上面的代码示例来实现这一点。

或者我如何禁用按钮3秒钟为什么使用
System.Threading.Thread.Sleep(3000)为什么要禁用按钮仅3秒钟?此代码是否在
async
线程下运行?这是一个Windows窗体(使用System.Windows.Forms)?@M.NasserJavaid cz当看不到程序运行时,我们的用户喜欢连续单击按钮两次或三次。这对他们和我都不好。如果不等待3秒,按钮启用太快,无法看到。