如何在 C # 中为程序添加延迟?
你可以使用 Thread.Sleep()函数,例如。
Thread.Sleep()
int milliseconds = 2000; Thread.Sleep(milliseconds);
完全停止执行当前线程2秒。
也许对于 Thread.Sleep来说,最合适的场景是当您想要延迟另一个线程中的操作时,不同于主线程,例如:
Thread.Sleep
MAIN THREAD ---------------------------------------------------------> (UI, CONSOLE ETC.) | | | | OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
对于其他场景(例如,在一段时间后启动操作等) ,请检查 科迪的回答。
使用间隔设置为2-3秒的计时器。
根据你正在编写的应用程序的类型,你有三种不同的选择:
System.Timers.Timer
System.Windows.Forms.Timer
System.Threading.Timer
如果您的应用程序需要同时处理该线程上的任何输入(WinForms,WPF) ,则不要使用 Thread.Sleep,因为 Sleep会完全锁定该线程并阻止它处理其他消息。假设一个单线程应用程序(和大多数应用程序一样) ,您的整个应用程序将停止响应,而不是像您可能希望的那样延迟一个操作。请注意,在纯控制台应用中使用 Sleep 可能没有问题,因为没有“事件”需要处理或在单独的线程上(也可以选择使用 Task.Delay)。
Sleep
Task.Delay
除了定时器和 Sleep之外,你还可以使用 Task.Delay,它是 Sleep的异步版本,不会阻止线程处理事件(如果使用得当——不要使用 .Wait()将其变成无限睡眠)。
.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 博客上的异步主干) ,同样的 await Task.Delay(2000)也可以用在控制台应用的 Main方法中。
await Task.Delay(2000)
Main
注意: 使用 Sleep延迟操作的好处是可以避免由于使用计时器/Delay可能启动多个操作而产生的竞态条件。不幸的是,冻结基于 UI 的应用程序是不可接受的,所以你需要考虑如果你开始多次延迟(例如,如果它是由一个按钮点击触发)会发生什么-考虑禁用这样的按钮,或取消计时器/任务或确保延迟操作可以安全地多次完成。
Delay
System.Threading.Thread.Sleep( (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
或与 using声明:
using
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
我更喜欢这个 1000 * numSeconds(或简单的 3000) ,因为它使之更加明显的人谁没有使用 Thread.Sleep之前。最好能证明你的意图。
1000 * numSeconds
3000
在2.3秒内,你应该这样做:
System.Threading.Thread.Sleep(2300);