我程序的一部分通过网络连接接收输入,然后发回消息。我想限制某个输入可以触发消息的次数,因此程序不能超载。
我有一个等待输入的后台工作程序,然后当它收到某个输入时,它会调用一个静态类来确定自上次输入以来是否有足够的时间。我正在使用
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
写入控制台应该如此,但只是等待计时器不起作用。它将发送一次响应,然后不再发送,因为计时器永远不会停止。
荒谬的是,我让它在另一堂课中几乎完全相同。唯一的区别是计时器一直在运行。
我错过了什么?
答案 0 :(得分:3)
您的代码的一个问题是它使用后台线程中的System.Windows.Forms.Timer
类而不与窗口关联。这违反了documentation:
此计时器已针对Windows窗体应用程序进行了优化,必须在窗口中使用。
对于与GUI对象无关的计时器,请使用System.Timers.Timer
。
这可能会或可能不是您遇到的问题的原因,但是您需要解决的一件事是您的代码才能正常运行。