System.Timers.Timer timer = new System.Timers.Timer();
private void button1_Click(object sender, EventArgs e)
{
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Interval = 2000;
timer.Enabled = true;
timer.Start();
}
private void timer_Elapsed(object myobject, System.Timers.ElapsedEventArgs e)
{
Say("Time hit" + DateTime.Now.ToString());
}
我错过了什么?
编辑:
试图补充:
timer.AutoReset = true;
对于那些好奇的Say Method是:
private void Say(string s)
{
try
{
txtSay.AppendText(s + "\r\n");
}
catch
{
}
}
say方法没有问题。适用于其他一切。
答案 0 :(得分:5)
我认为您没有提到您获得跨线程异常.. 尝试改变代码:
Invoke(new Action(()=>Say("Time hit" + DateTime.Now.ToString())));
答案 1 :(得分:5)
由于
然后你吞下那个没有任何痕迹的例外
private void Say(string s)
{
try
{
txtSay.AppendText(s + "\r\n");
}
catch // empty catch-block: the real fundamental problem
{
}
}
因此Timer事件会触发,但会产生一个隐藏的错误。
简短实用的解决方案是将Windows.Timer用于GUI相关计时器。
答案 2 :(得分:0)
这可能不对,但是通过MSDN示例,您不需要调用t.Start(),t.Enable应该启动它。由于您通过执行t.Enabled和t.Start启动它,因此可能与AutoRest属性存在一些冲突。
我还要通过添加断点或类似的东西来确保Say方法能够正常工作。在这种情况下,我不知道你在调用AppendText。
一点猜测工作。
答案 3 :(得分:0)
您无需在Click方法中设置EventHandler。设置它,例如在你的类的构造函数中,它将工作。
将Start()方法保留在click函数中:
private void button1_Click(object sender, EventArgs e)
{
timer.Start();
}
答案 4 :(得分:0)
正如Reniuz所说,你可能会遇到异常,因为你试图从不同的线程更新UI。 Timer
类在单独的线程上运行,以防止它干扰应用程序的响应性。
这是一个很好的例子,为什么try { /* something */ } catch {}
是一个坏主意 - 你通过写这个来完全隐藏自己的错误。如果您还没有写过,那么您可能已经能够确定需要在异常消息中的正确线程上调用UI更新。
答案 5 :(得分:0)
在C ++ / CLI(使用.NET的托管C ++ - 它真的对C#关闭)你应该通过这个计时器设置对象同步。
它看起来像这样:+ -
timer->SynchronizingObject = txtSay;
在C#中可能:使用“。”而不是“ - >”
请参阅此artice