如何在C#中为程序添加延迟?
如何在C#中为程序添加延迟?
Answers:
您可以使用Thread.Sleep()
功能,例如
int milliseconds = 2000;
Thread.Sleep(milliseconds);
会完全停止当前线程的执行2秒钟。
可能最适合的情况Thread.Sleep
是,当您想延迟另一个线程中的操作时,不同于主要线程,例如:
MAIN THREAD --------------------------------------------------------->
(UI, CONSOLE ETC.) | |
| |
OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
对于其他情况(例如,一段时间后开始操作等),请查看Cody的答案。
await Task.Delay(milliseconds)
。这对我
使用间隔设置为2-3秒的计时器。
根据要编写的应用程序类型,您可以选择三个不同的选项:
Thread.Sleep
如果您的应用程序需要同时处理该线程上的任何输入(WinForms,WPF),请不要使用,因为这Sleep
将完全锁定该线程并阻止其处理其他消息。假定一个单线程应用程序(大多数情况下),您的整个应用程序将停止响应,而不仅仅是延迟您可能想要的操作。请注意,在纯控制台应用程序中使用Sleep可能会很好,因为没有要处理的“事件”或没有单独的线程(也是Task.Delay
更好的选择)。
除了计时器外,Sleep
您还可以使用Task.Delay
的异步版本Sleep
,它不会阻止线程处理事件(如果使用得当,请不要通过使用使其变为无限睡眠.Wait()
)。
public async void ClickHandler(...)
{
// whatever you need to do before delay goes here
await Task.Delay(2000);
// whatever you need to do after delay.
}
如果使用C#7.1(MSDN博客上的Async main),await Task.Delay(2000)
则可以在Main
控制台应用程序的方法中使用相同的方法。
注意:延迟操作的Sleep
好处是避免了由于可能使用timers /启动多个操作而导致的竞争情况Delay
。不幸的是,冻结基于UI的应用程序是不可接受的,因此您需要考虑如果启动多个延迟(即,如果它是由单击按钮触发的)会发生什么情况-请考虑禁用此类按钮,或者取消计时器/任务或确保延迟操作可以安全地进行多次。
Thread.Sleep
警告可能不那么重要。
await Task.Delay()
控制台应用程序实际上可能想要使用的版本和内联注释吗Sleep
(非异步Main
)或Delay
(异步Main
)
在2.3秒内,您应该执行以下操作:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
或带有using
语句:
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
我更喜欢1000 * numSeconds
(或简单地说3000
)这是因为它使过去从未使用Thread.Sleep
过的人的情况变得更加明显。它可以更好地记录您的意图。
Thread.Sleep(TimeSpan)
直接使用,而不必强制转换为int。