C#System.Windows.Forms.Timer没有调用EventHandler

时间:2015-02-11 19:50:12

标签: c# timer eventhandler

我程序的一部分通过网络连接接收输入,然后发回消息。我想限制某个输入可以触发消息的次数,因此程序不能超载。

我有一个等待输入的后台工作程序,然后当它收到某个输入时,它会调用一个静态类来确定自上次输入以来是否有足够的时间。我正在使用

System.Windows.Forms.Timer

要做到这一点。看起来像这样(一切都是公开的,所以我可以调试):

public static class InputResponse
{
    public static System.Windows.Forms.Timer Time = new System.Windows.Forms.Timer();

    public static void CreateTimer()//set all the properties of the timer
    {
        Time.Interval = 3000;
        Time.Tick += new EventHandler(Time_Tick);
    }

    public static void InputAReceived()
    {
        if (Time.Enabled) //if the timer is running, do nothing
            return;
        else
        {
        //send response here
            Time.Start();
        }
    }

    public static void Time_Tick(object sender, EventArgs e)
    {
        Console.WriteLine("Time_Tick");
        Time.Stop();
    }
}

问题是,Time_Tick方法永远不会从计时器调用。我可以使用Invoke()来触发这样的方法,

    EventHandler testHandler = new EventHandler(InputResponse.Time_Tick);
    testHandler.Invoke(sender, e);//triggered by a button

写入控制台应该如此,但只是等待计时器不起作用。它将发送一次响应,然后不再发送,因为计时器永远不会停止。

荒谬的是,我让它在另一堂课中几乎完全相同。唯一的区别是计时器一直在运行。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

您的代码的一个问题是它使用后台线程中的System.Windows.Forms.Timer类而不与窗口关联。这违反了documentation

中给出的说明
  

此计时器已针对Windows窗体应用程序进行了优化,必须在窗口中使用。

对于与GUI对象无关的计时器,请使用System.Timers.Timer

这可能会或可能不是您遇到的问题的原因,但是您需要解决的一件事是您的代码才能正常运行。