如何在没有System.Threading.Thread.Sleep的情况下停止程序。 C#?
System.Threading.Thread.Sleep
适用于停止时间的应用程序,但它不起作用,因为我需要。如何在没有System.Threading.Thread.Sleep的情况下停止程序。 C#?
这是我的代码:
buttonShip.Enabled = false;
Saving();
SetProperties();
Loading();
ShowLabels();
System.Threading.Thread.Sleep(3000);
buttonShip.Enabled = true;
我可以先点击后立即点击buttonShip。当程序显示该按钮是已禁用时,其实际上已启用。
我的问题是,我如何停止程序3秒?
没有a good, minimal, complete code example明确说明你的情况,很难确切知道你想要做什么。
但是,在我看来,您真正想要的是在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毫秒内执行,在这种情况下,该按钮必须在3秒内被激活100毫秒。如果程序执行5秒,在这种情况下,该按钮必须在8秒后激活
我了解,无论执行其他任务需要多长时间,您都希望按钮不被重新启用直到3秒后。我已经更新了上面的代码示例来完成此操作。
或者我如何禁用按钮3秒 – Roman
为什么你使用'系统。Threading.Thread.Sleep(3000);'为什么你想禁用按钮只有3秒? –
此代码是否在'async'线程下运行? –