When writing console apps sometimes you want to delay the closing of the console window to give the user time to read the output. Often, if something went wrong, I would simply report the error to the standard output and immediately exit the application. However that did not work too well for my users; the exit message was not displayed long enough for them to read so they knew how to correct the issue. What I needed was something that give a user enough time to read the output, but not prevent the process from exiting if it was being ran as a scheduled/automated task. The solution I came up with was a countdown timer that would block execution from proceeding until it counted back from some number to zero.
Lets view the code, shall we:
public static void CountdownTimer(int Seconds = 5)
{
Console.ResetColor();
Console.WriteLine(Environment.NewLine);
Console.Write("The application will now terminate... ");
if (Seconds < 1) return;
if (Seconds > 9) Seconds = 9;
for (int counter = Seconds * 10; counter > 0; counter--)
{
if (Console.KeyAvailable)
return;
if (counter % 10 == 0)
Console.Write("\b{0}", (counter / 10));
System.Threading.Thread.Sleep(100);
}
}
I print each number as the timer counts down. Each time I print a new number, I place a backspace "\b" before it to erase the previous number. To avoid having to keep track how many character a digit prints to use the same number of backspaces, I just kept the function simple by limiting the number of seconds to a max of 9.
I check for Console.KeyAvailable to detect key strokes to skip the rest of the countdown and exit immediately. The reason I did 10 Sleeps of 100ms per second was to make the exit upon key press more responsive.