我正在使用onkeyPress事件和一个计时器来执行一个方法。我有一个文本框,我希望允许用户在文本框中键入他们的服务器名称。传统上每次按键都会触发事件,但是我将我的方法放在计时器已用事件中,并希望计时器仅在用户等待五秒钟时触发动作。下面是我的计时器。
private void tbServer_KeyPress(object sender, KeyPressEventArgs e)
{
//atimer.Stop();
atimer = new System.Timers.Timer();
atimer.Interval = 5000;
atimer.AutoReset = false;
if (atimer.Enabled)
{
return;
}
else
{
atimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
atimer.Enabled = true;
}
}
从上面开始,我希望我的计时器仅在定时器的另一个实例没有运行时才触发经过的事件(即在计时器的五秒间隔之前忽略任何按键)。我在
下面的已用定时器事件中执行完毕后停止我的计时器 private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
if (ping(tbServer.Text, 1))
{
string txt = "Server Matched";
SetText(txt, true);
atimer.Enabled = false;
}
else
{
string txt = " Invalid Server Address";
SetText(txt, false);
atimer.Enabled = false;
}
}
无论条件如何,上述代码都会上升每个键类型的定时器已用事件。当用户没有留出5秒的间隔时,如何忽略键类型?
答案 0 :(得分:0)
每个按键都会创建一个新计时器,
在为其分配新计时器之前,您需要检查aTimer。
if(aTimer == null)
{
aTimer = new System.Timers.Timer();
atimer.Interval = 5000;
atimer.AutoReset = false;
}
答案 1 :(得分:0)
问题是你在5秒后触发的每次点击都会创建一个新的Timer实例。如果您禁用/处置已有的计时器,其他计时器将停止。
if (atimer != null)
{
atimer.Stop();
atimer.Dispose();
atimer = null;
}
atimer = new System.Timers.Timer();
atimer.Interval = 5000;
atimer.AutoReset = false;
if (atimer.Enabled)
{
return;
}
else
{
atimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
atimer.Enabled = true;
}