By my understanding, Thread.Sleep() is bad because it forces the thread's resources out of the cache, so they have to be loaded again afterwards. Not a big deal, but it could aggravate performance issues in high-load situations. And then there's the fact that the timing isn't precise, and that it effectively can't wait for durations under about 10ms...
I use this snippet:
new System.Threading.ManualResetEvent(false).WaitOne(1000);
Easy as pie and it all fits on one line. Creates a new event handler that will never be set, and then waits the full timeout period, which you specify as the argument to WaitOne()
.
Although, for this specific scenario, a Timer would probably be a more appropriate approach:
var workTimer = new System.Threading.Timer(
(x) => DoWork(),
null,
1000, // initial wait period
300000); // subsequent wait period
Then, instead of setting a cancel variable, you would stop the timer with workTimer.Stop()
.
Edit:
Since people are still finding this useful, I should add that .NET 4.5 introduces the Task.Delay method, which is even more concise and also supports async:
Task.Delay(2000).Wait(); // Wait 2 seconds with blocking
await Task.Delay(2000); // Wait 2 seconds without blocking
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…