So I had a project where I need to have pretty good uptime (.99999) or something like that. My first thought was to write a Window's Service to house my code. I had built the prototype as a Console Application and it wouldn't be that hard to move the logic into a Service. I was planning on using the customizable failure handlers in Windows (right click any service in the services manager MMC and then click on the Recovery Tab to see what I am referring to) to restart the service and possible do some other stuff. Window's services also have built in support for writing to the event log.
However, I had already added log4net logging and used the email logging to send notifications on failures, all I really needed was the restart-ability that services provide. Then I had a flash back to my Tech Services days when I used to supported many automated batch type applications that were managed with the Window's Task Scheduler. I decided to rely on one not so known feature which I will describe in a moment. Most tasks are scheduled once a day or week, month, etc. I scheduled my tasks to run starting now and then repeat every one minute ad infinitum (forever, basically).
Here's the magic: the Window's task schedule won't start a task that is already running! So now if my task fails it will restart in <= a minute without any of the pains of a Window's Service (installation and configuration, etc).
One day I will find a reason to write a Window's Service but every time I think I need to, I find some way around it.