C# Истекшее событие класса System.Timers.Timer и общие меры предосторожности для таймера - PullRequest
1 голос
/ 27 мая 2020

Два вопроса.

Один: в приложении winforms - хорошая или плохая идея - включать и отключать system.timers.timer внутри прошедшего события, чтобы основной поток пользовательского интерфейса мог иметь доступ к переменным и методам, которые были созданы в этом основном потоке пользовательского интерфейса? Так, например, с кодом:

myElapsedTimerEvent(object sender, ElapsedEventArgs args)
{
   timer.enabled = false; 
   /***Call some functions and manipulate some variables***/
   timer.enabled = true;
}

Два: по любому опыту, какие меры предосторожности и какие опасности следует предупреждать в отношении system.timers.timer в winform и c#? Есть ли какие-либо примеры, которые вы можете предоставить о том, что может произойти с оборудованием и / или программным обеспечением, если таймер не используется должным образом?

Мы будем очень признательны за любые предложения по использованию system.timers.timer.

Спасибо за внимание.

1 Ответ

1 голос
/ 27 мая 2020

Безопасно устанавливать свойство Enabled таймера внутри обработчика событий, при условии, что обработчик событий выполняется в потоке пользовательского интерфейса. В противном случае это небезопасно, потому что System.Timers.Timer класс не является потокобезопасным . Чтобы обработчик выполнялся в потоке пользовательского интерфейса, вы должны установить для свойства SynchronizingObject таймера текущее значение Form. Например:

public Form1()
{
    InitializeComponent();
    timer = new Timers.Timer(5000);
    timer.Elapsed += Timer_Elapsed;
    timer.SynchronizingObject = this;
    timer.AutoReset = true;
}

Если я не ошибаюсь, это назначение происходит автоматически, когда вы используете конструктор для добавления Timer в Form.

Я предлагаю используйте System.Windows.Forms.Timer, потому что он поставляется без соображений безопасности потоков. Вы не ограничены только одним таймером. Вы можете иметь их сколько угодно. Просто имейте в виду, что их обработчики выполняются в потоке пользовательского интерфейса, поэтому вам следует избегать размещения там длинного кода, иначе может пострадать отзывчивость пользовательского интерфейса.

...