I understand that in a Windows service, it is better to use Timer
rather than Thread.Sleep(timeout)
. However, in all code examples I could find on the Internet that were handling Azure workers, it is Thread.Sleep(timeout)
which is used instead of Timer
.
Even the default code provided in the Worker project template in Visual Studio uses a Thread.Sleep
:
public class WorkerRole : RoleEntryPoint
{
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("$projectname$ entry point called", "Information");
while (true)
{
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
}
// ...
}
So far, I've been also using Thread.Sleep
in my workers but without really understanding why. So my question is, why using Thread.Sleep(timeout)
in Azure worker role rather than Timer
? What is the difference between Windows service and Azure worker that leads to this difference in how we are supposed to conceive this kind of application? Is it good or bad to use Timer
in Azure workers?
Any explanation with links to some resources explaining the fundamentals of this is welcome as I couldn't find anything so far.
The purpose of the
Thread.Sleep()
loop is to keep theRun()
method from exiting. IfRun()
exits, then your worker will restart. I don't know that you could accomplish that goal effectively with a Timer.Most likely your CPU is wasting some tiny amount of time to wake up that thread every 1000 msecs in order to do nothing. I doubt it's significant, but it bugged me too. My solution was to wait on a CancellationToken instead.
This keeps the Run() method from exiting without wasting CPU time on busy waiting. You can also use the CancellationToken elsewhere in your program to initiate any other shutdown operations you may need to perform.
Thread.Sleep
is literally waste of your processor's time. Your thread is blocked and though CPU is doing nothing it cannot be used by other threads. I am not familiar with pricing model of Azure, but you could be potentially charged for this time, because your thread used it :)So
Timer
should always be used for any kind of pause.Code examples usually use
Thread.Sleep
for the simplicity.