The problems with calling Thread.Sleep
are explained quite succinctly here:
Thread.Sleep
has its use: simulating lengthy operations while testing/debugging on an MTA thread. In .NET there’s no other reason to use it.
Thread.Sleep(n)
means block the current thread for at least the number
of timeslices (or thread quantums) that can occur withinn
milliseconds.
The length of a timeslice is different on different versions/types of
Windows and different processors and generally ranges from 15 to 30
milliseconds. This means the thread is almost guaranteed to block for
more thann
milliseconds. The likelihood that your thread will
re-awaken exactly aftern
milliseconds is about as impossible as
impossible can be. So,Thread.Sleep
is pointless for timing.Threads are a limited resource, they take approximately 200,000 cycles
to create and about 100,000 cycles to destroy. By default they
reserve 1 megabyte of virtual memory for its stack and use 2,000-8,000
cycles for each context switch. This makes any waiting thread a
huge waste.
The preferred solution: WaitHandles
The most-made-mistake is using Thread.Sleep
with a while-construct (demo and answer, nice blog-entry)
EDIT:
I would like to enhance my answer:
We have 2 different use-cases:
We are waiting because we know a
specific timespan when we should continue (useThread.Sleep
,System.Threading.Timer
or alikes)We are waiting because some condition changes some time …
keyword(s) is/are some time! if the condition-check is in our code-domain, we
should use WaitHandles – otherwise the external component should
provide some kind of hooks … if it doesn’t its design is bad!My answer mainly covers use-case 2