And*_*rej 10 c# timer winforms
我有一个奇怪的问题......在过去的几个小时里我一直在想不起......我在winform代码中输入的计时器(来自工具栏)不会打勾......
我在我的程序中有两种形式的计时器,它们都工作正常...我尝试完全相同它不会勾选...我选择它,将它拖到一个表单上,启用它,设置间隔和处理滴答事件...没有任何反应...我甚至尝试在tick事件中放置像messagebox.show这样的随机代码,只是为了看看是否有任何事情发生,什么都没有!正如我所说,我的程序中有一些更多的计时器(在其他形式,而不是我试图把这个计时器的那个),他们都工作正常...
有什么建议?
提前致谢!
小智 10
我发现如果我从非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); }
}
Run Code Online (Sandbox Code Playgroud)
这种方法有三点:
1)通过重写构造函数,我确保从一开始就启用基本计时器.
2)通过覆盖"启用",我从不让基本定时器被禁用,但接口不会改变.
3)通过覆盖"OnTick",我让被覆盖的Enabled属性决定事件是否应该触发.
Start()和Stop()分别通过将true和false设置为Enabled属性来工作.
顺便说一句 - 有没有人知道为什么当从非UI线程停止/禁用定时器时,事件永远不会触发(或断开连接?)?
不要System.Windows.Forms.Timer计时器启动.enabled ...无论如何..我刚刚开始工作......我将视觉工作室生成的代码形式WINFORMNAME.designer.cs复制到WINFORMNAME.cs. ..我不知道如何以及为什么但它有效...
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Enabled = true;
timer.Interval = 1000;
timer.Tick += new EventHandler(timer_Tick);
void timer_Tick(object sender, EventArgs e)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
谢谢大家的答案!