我有一个奇怪的问题
过去几个小时,我一直在想我
我放在我的winform代码(从工具栏)的计时器不会打勾…
过去几个小时,我一直在想我
我放在我的winform代码(从工具栏)的计时器不会打勾…
我在我的程序中有几个表单的计时器,他们都工作正常…我尝试完全一样,它不会打勾…
我选择它,拖动到窗体,启用它,设置间隔和处理tick事件…没有任何反应…
我甚至尝试把随机代码像messageBox.show在tick事件只是为了看是否有任何事情,没有什么!
正如我所说,在我的程序中有一个更多的计时器(在其他形式,不是在我想要放这个计时器),他们都工作正常…
有什么建议么?
提前致谢!
解决方法
我发现如果我从非UI线程停止计时器,那么再次启动它,我失去了事件钩子.
我不知道“适当”的答案是什么,但对我来说这是很好的:
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()分别通过将Enabled属性设置为true和false来工作.
BTW – 有没有人知道为什么事件永远不会触发(或断开?)当定时器从非UI线程停止/禁用?