如何在没有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秒,按钮启用太快,无法看到。