为什么我的System.Timers.Timer事件没有在C#中触发

时间:2012-01-12 09:59:01

标签: c# timer

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方法没有问题。适用于其他一切。

6 个答案:

答案 0 :(得分:5)

我认为您没有提到您获得跨线程异常.. 尝试改变代码:

Invoke(new Action(()=>Say("Time hit" + DateTime.Now.ToString())));

答案 1 :(得分:5)

由于

  1. 您的Timers.Timer未设置SyncObject
  2. 因此,您的事件会在另一个线程上触发
  3. 设置Text属性会引发交叉线程异常
  4. 然后你吞下那个没有任何痕迹的例外

    private void Say(string s)
    {
        try
        {
            txtSay.AppendText(s + "\r\n");
        }
        catch  // empty catch-block: the real fundamental problem
        {
        }
    }
    
  5. 因此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