Я обнаружил, что если я остановлю таймер из потока, не являющегося пользовательским интерфейсом, а затем запустлю его снова, я потеряю ловушку событий.
Я не знаю, что такое «правильный» ответ, но для меня это сработало:
public class BetterTimer : System.Windows.Forms.Timer
{
public BetterTimer():base()
{ base.Enabled = true; }
public BetterTimer(System.ComponentModel.IContainer container) : base(container)
{ base.Enabled = true; }
private bool _Enabled;
public override bool Enabled
{
get { return _Enabled; }
set { _Enabled = value; }
}
protected override void OnTick(System.EventArgs e)
{ if (this.Enabled) base.OnTick(e); }
}
Три вещи для этого подхода:
1) Переопределяя конструкторы, я гарантирую, что базовый таймер включается с самого начала.
2) Переопределив «Включено», я никогда не позволяю отключить базовый таймер, но интерфейс не меняется.
3) Переопределив «OnTick», я позволил переопределенному свойству Enabled решить, должно ли событие сработать.
Start () и Stop () работают, устанавливая true и false для свойства Enabled соответственно.
Кстати: кто-нибудь знает, почему событие никогда не срабатывает (или отключается?), Когда таймер останавливается / отключается из потока, не являющегося пользовательским интерфейсом?