воскресенье, 13 сентября 2015 г.

Как приостановить выполнение программы на X секунд

Спросили меня, вроде бы простой вопрос - "Как приостановить выполнение программы на X секунд". Естественно в C#. Первый (и очень часто единственный) вариант это Thread.Sleep(1000); Но для порядка решил погуглить и покопаться на stackoverflow.

И вот к чему я пришел -
Используйте

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer
Лучше не использовать Thread.Sleep, так как это полностью заблокирует нить и предотвратит её от обработки других сообщений.

Если предположить, что у вас однопоточное приложение (а они большинство), ваше приложение прекратит отвечать на все запросы, а не просто остановится на время, как можно подумать.

Для контроля (сколько времени реально выполнялось) можно использовать System.Diagnostics.Stopwatcth
Пример кода -

using System;
using System.Diagnostics;

namespace TimerTest
{
    class Program
    {
        static System.Timers.Timer aTimer;
        static Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();

        static void Main(string[] args)
        {
            aTimer = new System.Timers.Timer(2000);
            aTimer.Elapsed += OnTimedEvent;
            //Разовое выполнение таймера
            aTimer.AutoReset = false;
            aTimer.Enabled = true;

            Console.WriteLine("Press the Enter key to continue the program at any time... ");
            Console.ReadLine();            

            TimeSpan ts = stopwatch.Elapsed;

            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine("RunTime " + elapsedTime);
            Console.ReadLine();
        }

        private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
        {
            Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
            stopwatch.Stop();
        }
    }
}