C# Sleep

Sleep

Sleep pauses programs. It receives a value indicating the number of milliseconds to wait. This can be useful for waiting on an external application or task. It does not cause CPU usage during the pause.

Example

Sleep is found on the Thread class. It is a static method that receives one parameter. You must either include System.Threading or use the fully qualified name for the method invocation, which is System.Threading.Thread.Sleep.

Lazy type

Tip:You do not need to create a new Thread to use the Sleep method as it is static.

Static Method

Next:This example shows the runtime behavior of the Thread.Sleep method in the .NET Framework.

C# program that sleeps

using System;
using System.Diagnostics;
using System.Threading;

class Program
{
    static void Main()
    {
	//
	// Demonstrates three different ways of calling Sleep.
	//
	var stopwatch = Stopwatch.StartNew();
	Thread.Sleep(0);
	stopwatch.Stop();
	Console.WriteLine(stopwatch.ElapsedMilliseconds);
	Console.WriteLine(DateTime.Now.ToLongTimeString());

	stopwatch = Stopwatch.StartNew();
	Thread.Sleep(5000);
	stopwatch.Stop();
	Console.WriteLine(stopwatch.ElapsedMilliseconds);
	Console.WriteLine(DateTime.Now.ToLongTimeString());

	stopwatch = Stopwatch.StartNew();
	System.Threading.Thread.Sleep(1000);
	stopwatch.Stop();
	Console.WriteLine(stopwatch.ElapsedMilliseconds);

	//
	// Bonus: shows SpinWait method.
	//
	stopwatch = Stopwatch.StartNew();
	Thread.SpinWait(100000 * 10000);
	stopwatch.Stop();
	Console.WriteLine(stopwatch.ElapsedMilliseconds);
    }
}

Output

0              ElapsedMilliseconds after Sleep(0)
8:14:43 AM     Time after Sleep(0)
4999           ElapsedMilliseconds after Sleep(5000)
8:14:48 AM     Time after Sleep(5000)
999            ElapsedMilliseconds after Sleep(1000)
3144           ElapsedMilliseconds after SpinWait(Int32)
Main method

The program defines the Main entry point in the Program class, which contains three method invocations to the Thread.Sleep method with varying calling syntaxes and parameters. The results of the Console.WriteLine calls are shown.

Console.WriteLine

Note:The surrounding code around the Sleep invocations takes the system's time and uses Stopwatch to time the Thread.Sleep calls.

Stopwatch

Implementation

Framework: NET

Next we review the implementation of the Thread.Sleep method and the Thread.SpinLock method in the .NET Framework. These two methods call into the SleepInternal and SpinWaitInternal functions in mscorlib.

Tip:Thread.Sleep likely will end up calling the same code in the Windows kernel that the Sleep call in any language uses.

SpinWait

Arrow indicates looping

When you execute the above program, you will notice that the program does not require significant CPU time when executing the Thread.Sleep calls. It only starts consuming the entire CPU core when the Thread.SpinWait method is invoked.

So:Sleep uses the operating system to "pause" the program, resulting in 0% CPU, while Thread.SpinWait executes useless instructions.

SpinWait

Summary

C# programming language

Thread.Sleep is fairly accurate in pausing the program for the specified number of milliseconds. It does not cause your program to consume 100% CPU. This will save power and provide more resources for other programs.

Finally:We noted the implementation in the .NET Framework and also talked about idle loops and SpinWait.


C#: .NET: Thread