Console animations

Solution 1:

Traditional Console Spinner:

    static void Main(string[] args)
    {
        ConsoleSpiner spin = new ConsoleSpiner();
        Console.Write("Working....");
        while (true) 
        {
            spin.Turn();
        }
    }

public class ConsoleSpiner
{
    int counter;
    public ConsoleSpiner()
    {
        counter = 0;
    }
    public void Turn()
    {
        counter++;        
        switch (counter % 4)
        {
            case 0: Console.Write("/"); break;
            case 1: Console.Write("-"); break;
            case 2: Console.Write("\\"); break;
            case 3: Console.Write("|"); break;
        }
        Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
    }
}

Solution 2:

Here is my spinner. The purpose of it is to have a program do some work while the spinner displays to the user that something is actually happening:

  public class Spinner : IDisposable
  {
     private const string Sequence = @"/-\|";
     private int counter = 0;
     private readonly int left;
     private readonly int top;
     private readonly int delay;
     private bool active;
     private readonly Thread thread;

     public Spinner(int left, int top, int delay = 100)
     {
        this.left = left;
        this.top = top;
        this.delay = delay;
        thread = new Thread(Spin);
     }

     public void Start()
     {
        active = true;
        if (!thread.IsAlive)
           thread.Start();
     }

     public void Stop()
     {
        active = false;
        Draw(' ');
     }

     private void Spin()
     {
        while (active)
        {
           Turn();
           Thread.Sleep(delay);
        }
     }

     private void Draw(char c)
     {
        Console.SetCursorPosition(left, top);
        Console.ForegroundColor = ConsoleColor.Green;
        Console.Write(c);
     }

     private void Turn()
     {
        Draw(Sequence[++counter % Sequence.Length]);
     }

     public void Dispose()
     {
        Stop();
     }
  }

And you use the class like this:

     var spinner = new Spinner(10, 10);

     spinner.Start();

     // Do your work here instead of sleeping...
     Thread.Sleep(10000);

     spinner.Stop();

Solution 3:

Yes, there are quite a few methods for this.

In particular, you may want to look at the following Console methods:

  1. SetCursorPosition (you can move the cursor around, and overwrite elements)
  2. MoveBufferArea (copy/paste over the top of regions)
  3. ForegroundColor and BackgroundColor (change coloring)

Solution 4:

Great work with the ConsoleSpinner and the sequence implementation. Thanks for the code. I thought about sharing my customized approach.

    public class ConsoleSpinner
    {
        static string[,] sequence = null;

        public int Delay { get; set; } = 200;

        int totalSequences = 0;
        int counter;

        public ConsoleSpinner()
        {
            counter = 0;
            sequence = new string[,] {
                { "/", "-", "\\", "|" },
                { ".", "o", "0", "o" },
                { "+", "x","+","x" },
                { "V", "<", "^", ">" },
                { ".   ", "..  ", "... ", "...." },
                { "=>   ", "==>  ", "===> ", "====>" },
               // ADD YOUR OWN CREATIVE SEQUENCE HERE IF YOU LIKE
            };

            totalSequences = sequence.GetLength(0);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sequenceCode"> 0 | 1 | 2 |3 | 4 | 5 </param>
        public void Turn(string displayMsg = "", int sequenceCode = 0)
        {
            counter++;
            
            Thread.Sleep(Delay);

            sequenceCode = sequenceCode > totalSequences - 1 ? 0 : sequenceCode;

            int counterValue = counter % 4;

            string fullMessage = displayMsg + sequence[sequenceCode, counterValue];
            int msglength = fullMessage.Length;

            Console.Write(fullMessage);

            Console.SetCursorPosition(Console.CursorLeft - msglength, Console.CursorTop);
        }
    }

Implementation:

    ConsoleSpinner spinner = new ConsoleSpinner();
    spinner.Delay = 300;
    while (true)
    {
        spinner.Turn(displayMsg: "Working ",sequenceCode:5);
    }

Output:

enter image description here