C# Language
Таймеры
Поиск…
Синтаксис
-
myTimer.Interval
- устанавливает, как часто вызывается событие «Tick» (в миллисекундах) -
myTimer.Enabled
- логическое значение, которое устанавливает таймер для включения / отключения -
myTimer.Start()
- запуск таймера. -
myTimer.Stop()
- останавливает таймер.
замечания
Если вы используете Visual Studio, таймеры могут быть добавлены в виде элемента управления непосредственно в вашу форму из панели инструментов.
Многопоточные таймеры
System.Threading.Timer
- Простой многопоточный таймер. Содержит два метода и один конструктор.
Пример: таймер вызывает метод DataWrite, который пишет «многопоточность, выполненный ...», по прошествии пяти секунд, а затем каждую секунду после этого, пока пользователь не нажмет Enter:
using System;
using System.Threading;
class Program
{
static void Main()
{
// First interval = 5000ms; subsequent intervals = 1000ms
Timer timer = new Timer (DataWrite, "multithread executed...", 5000, 1000);
Console.ReadLine();
timer.Dispose(); // This both stops the timer and cleans up.
}
static void DataWrite (object data)
{
// This runs on a pooled thread
Console.WriteLine (data); // Writes "multithread executed..."
}
}
Примечание. Будет опубликован отдельный раздел для утилизации многопоточных таймеров.
Change
Этот метод можно вызвать, если вы хотите изменить интервал таймера.
Timeout.Infinite
- если вы хотите запустить только один раз. Задайте это в последнем аргументе конструктора.
System.Timers
- еще один класс таймера, предоставляемый .NET Framework. Он обертывает System.Threading.Timer
.
Особенности:
-
IComponent
-IComponent
его размещение в лотке компонента Designer в Visual Studio - Свойство
Interval
вместо методаChange
-
Elapsed
event
вместоdelegate
обратного вызова -
Enabled
для запуска и остановки таймера (default value = false
) -
Start
&Stop
если вы запутались в свойствеEnabled
(выше точки) -
AutoReset
- для указания повторяющегося события (default value = true
) - Свойство
SynchronizingObject
с методамиInvoke
иBeginInvoke
для безопасных методов вызова элементов WPF и элементов управления Windows Forms
Пример, представляющий все перечисленные выше функции:
using System;
using System.Timers; // Timers namespace rather than Threading
class SystemTimer
{
static void Main()
{
Timer timer = new Timer(); // Doesn't require any args
timer.Interval = 500;
timer.Elapsed += timer_Elapsed; // Uses an event instead of a delegate
timer.Start(); // Start the timer
Console.ReadLine();
timer.Stop(); // Stop the timer
Console.ReadLine();
timer.Start(); // Restart the timer
Console.ReadLine();
timer.Dispose(); // Permanently stop the timer
}
static void timer_Elapsed(object sender, EventArgs e)
{
Console.WriteLine ("Tick");
}
}
Multithreaded timers
- используйте пул потоков, чтобы несколько потоков могли обслуживать множество таймеров. Это означает, что метод обратного вызова или Elapsed
событие может запускаться по другому потоку каждый раз, когда он вызывается.
Elapsed
- это событие всегда срабатывает вовремя, независимо от того, является ли предыдущим Elapsed
закончило событие выполнения. Из-за этого обратные вызовы или обработчики событий должны быть потокобезопасными. Точность многопоточных таймеров зависит от ОС и обычно составляет 10-20 мс.
interop
- когда вам нужна более высокая точность, используйте это и вызовите мультимедийный таймер Windows. Это имеет точность до 1 мс и определяется в winmm.dll
.
timeBeginPeriod
- сначала timeBeginPeriod
это, чтобы сообщить ОС, что вам нужна высокая точность синхронизации
timeSetEvent
- вызывать это через timeBeginPeriod
для запуска мультимедийного таймера.
timeKillEvent
- вызывать это, когда вы закончите, это останавливает таймер
timeEndPeriod
- вызов этого, чтобы сообщить ОС, что вам больше не нужна высокая точность синхронизации.
Вы можете найти полные примеры в Интернете, которые используют мультимедийный таймер, dllimport
поиск ключевых слов dllimport
winmm.dll
timesetevent
.
Создание экземпляра таймера
Таймеры используются для выполнения задач через определенные промежутки времени (до X каждые Y секунд). Ниже приведен пример создания нового экземпляра таймера.
ПРИМЕЧАНИЕ . Это относится к таймерам, использующим WinForms. Если вы используете WPF, вы можете посмотреть в DispatcherTimer
using System.Windows.Forms; //Timers use the Windows.Forms namespace
public partial class Form1 : Form
{
Timer myTimer = new Timer(); //create an instance of Timer named myTimer
public Form1()
{
InitializeComponent();
}
}
Назначение обработчика события «Tick» для таймера
Все действия, выполняемые таймером, обрабатываются в событии «Tick».
public partial class Form1 : Form
{
Timer myTimer = new Timer();
public Form1()
{
InitializeComponent();
myTimer.Tick += myTimer_Tick; //assign the event handler named "myTimer_Tick"
}
private void myTimer_Tick(object sender, EventArgs e)
{
// Perform your actions here.
}
}
Пример: использование таймера для простого обратного отсчета.
public partial class Form1 : Form
{
Timer myTimer = new Timer();
int timeLeft = 10;
public Form1()
{
InitializeComponent();
//set properties for the Timer
myTimer.Interval = 1000;
myTimer.Enabled = true;
//Set the event handler for the timer, named "myTimer_Tick"
myTimer.Tick += myTimer_Tick;
//Start the timer as soon as the form is loaded
myTimer.Start();
//Show the time set in the "timeLeft" variable
lblCountDown.Text = timeLeft.ToString();
}
private void myTimer_Tick(object sender, EventArgs e)
{
//perform these actions at the interval set in the properties.
lblCountDown.Text = timeLeft.ToString();
timeLeft -= 1;
if (timeLeft < 0)
{
myTimer.Stop();
}
}
}
Результаты в ...
И так далее...