How can I add a delay to a program in C#?
You could use Thread.Sleep()
function, e.g.
int milliseconds = 2000;
Thread.Sleep(milliseconds);
that completely stops the execution of the current thread for 2 seconds.
Probably the most appropriate scenario for Thread.Sleep
is when you want to delay the operations in another thread, different from the main e.g. :
MAIN THREAD --------------------------------------------------------->
(UI, CONSOLE ETC.) | |
| |
OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
For other scenarios (e.g. starting operations after some time etc.) check Cody's answer.
Use a timer with an interval set to 2–3 seconds.
You have three different options to choose from, depending on which type of application you're writing:
System.Timers.Timer
System.Windows.Forms.Timer
System.Threading.Timer
Don't use Thread.Sleep
if your application need to process any inputs on that thread at the same time (WinForms, WPF), as Sleep
will completely lock up the thread and prevent it from processing other messages. Assuming a single-threaded application (as most are), your entire application will stop responding, rather than just delaying an operation as you probably intended. Note that it may be fine to use Sleep in pure console application as there are no "events" to handle or on separate thread (also Task.Delay
is better option).
In addition to timers and Sleep
you can use Task.Delay
which is asynchronous version of Sleep
that does not block thread from processing events (if used properly - don't turn it into infinite sleep with .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.
}
The same await Task.Delay(2000)
can be used in a Main
method of a console application if you use C# 7.1 (Async main on MSDN blogs).
Note: delaying operation with Sleep
has benefit of avoiding race conditions that comes from potentially starting multiple operations with timers/Delay
. Unfortunately freezing UI-based application is not acceptable so you need to think about what will happen if you start multiple delays (i.e. if it is triggered by a button click) - consider disabling such button, or canceling the timer/task or making sure delayed operation can be done multiple times safely.
For 2.3 seconds you should do:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Or with using
statements:
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
I prefer this to 1000 * numSeconds
(or simply 3000
) because it makes it more obvious what is going on to someone who hasn't used Thread.Sleep
before. It better documents your intent.
精彩评论