2015-07-10 93 views
2

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秒?

+0

或者我如何禁用按钮3秒 – Roman

+0

为什么你使用'系统。Threading.Thread.Sleep(3000);'为什么你想禁用按钮只有3秒? –

+0

此代码是否在'async'线程下运行? –

回答

0

没有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秒后。我已经更新了上面的代码示例来完成此操作。

相关问题