Я хочу повторять функцию с момента открытия программы до ее закрытия каждые несколько секунд. Как лучше всего это сделать на С#?
Повтор функции каждые несколько секунд
Ответы (4)
Используйте таймер. Существует 3 основных вида, каждый из которых подходит для разных целей.
Используйте только в приложении Windows Form. Этот таймер обрабатывается как часть цикла сообщений, поэтому таймер может зависнуть при высокой нагрузке.
Когда вам нужна синхронность, используйте этот. Это означает, что событие тика будет запущено в потоке, запустившем таймер, что позволит вам выполнять операции с графическим интерфейсом без особых хлопот.
Это самый мощный таймер, запускающий тики в фоновом потоке. Это позволяет выполнять операции в фоновом режиме, не останавливая графический интерфейс или основной поток.
В большинстве случаев я рекомендую System.Timers.Timer.
DispatcherTimer
(WPF/Silverlight), а также другие инструменты, такие как таймеры.
- person Reed Copsey; 02.07.2012
Для этого лучше всего подходит System.Timers.Timer
// Create a timer
myTimer = new System.Timers.Timer();
// Tell the timer what to do when it elapses
myTimer.Elapsed += new ElapsedEventHandler(myEvent);
// Set it to go off every five seconds
myTimer.Interval = 5000;
// And start it
myTimer.Enabled = true;
// Implement a call with the right signature for events going off
private void myEvent(object source, ElapsedEventArgs e) { }
Дополнительные сведения см. в разделе класс таймера (.NET 4.6 и 4.5).
Используйте таймер. Имейте в виду, что .NET поставляется с несколькими различными таймерами. Эта статья покрывает различия.
В .NET BCL есть много разных таймеров:
- System.Timers.Timer
- System.Threading.Timer
- System.Windows.Forms. Таймер
- System.Web.UI. Таймер
- System.Windows.Threading. DispatcherTimer
Когда какой использовать?
System.Timers.Timer
, который запускает событие и выполняет код в одном или нескольких приемниках событий через равные промежутки времени. Класс предназначен для использования в качестве серверного или сервисного компонента в многопоточной среде; он не имеет пользовательского интерфейса и не отображается во время выполнения.System.Threading.Timer
, который через равные промежутки времени выполняет один метод обратного вызова в потоке пула потоков. Метод обратного вызова определяется при создании экземпляра таймера и не может быть изменен. Как и класс System.Timers.Timer, этот класс предназначен для использования в качестве серверного или сервисного компонента в многопоточной среде; он не имеет пользовательского интерфейса и не отображается во время выполнения.System.Windows.Forms.Timer
(только .NET Framework) — компонент Windows Forms, запускающий событие и выполняющий код в одном или нескольких приемниках событий через равные промежутки времени. Компонент не имеет пользовательского интерфейса и предназначен для использования в однопоточной среде; он выполняется в потоке пользовательского интерфейса.System.Web.UI.Timer
(только .NET Framework) — компонент ASP.NET, выполняющий асинхронные или синхронные обратные передачи веб-страниц через регулярные промежутки времени.System.Windows.Threading.DispatcherTimer
, таймер, встроенный в очередь Dispatcher. Этот таймер обрабатывается с указанным приоритетом в указанный интервал времени.
Некоторым из них требуется явный вызов Start
, чтобы начать отсчет (например, System.Timers
, System.Windows.Forms
). И явный Stop
, чтобы закончить отметку.
using TimersTimer = System.Timers.Timer;
static void Main(string[] args)
{
var timer = new TimersTimer(1000);
timer.Elapsed += (s, e) => Console.WriteLine("Beep");
Thread.Sleep(1000); //1 second delay
timer.Start();
Console.ReadLine();
timer.Stop();
}
Хотя, с другой стороны, есть некоторые таймеры (например: System.Threading
), где вам не нужны явные вызовы Start
и Stop
. (Предоставленный делегат запустит фоновый поток.) Ваш таймер будет тикать до тех пор, пока вы или среда выполнения не избавитесь от него.
Таким образом, следующие две версии будут работать одинаково:
using ThreadingTimer = System.Threading.Timer;
static void Main(string[] args)
{
var timer = new ThreadingTimer(_ => Console.WriteLine("Beep"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
Console.ReadLine();
}
using ThreadingTimer = System.Threading.Timer;
static void Main(string[] args)
{
StartTimer();
Console.ReadLine();
}
static void StartTimer()
{
var timer = new ThreadingTimer(_ => Console.WriteLine("Beep"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
}
Но если ваш timer
утилизирован, то он, очевидно, перестанет тикать.
using ThreadingTimer = System.Threading.Timer;
static void Main(string[] args)
{
StartTimer();
GC.Collect(0);
Console.ReadLine();
}
static void StartTimer()
{
var timer = new ThreadingTimer(_ => Console.WriteLine("Beep"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
}