0

我正在使用 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 秒间隔时,如何让它忽略键类型?

4

2 回答 2

0

你每次按键都会创建一个新的计时器,

在为它分配新计时器之前,您需要检查 aTimer。

if(aTimer == null) 
{
    aTimer = new System.Timers.Timer();
    atimer.Interval = 5000;
    atimer.AutoReset = false;

}
于 2013-08-16T04:02:10.200 回答
0

问题是您在每次点击时都会创建一个新的 Timer 实例,该实例会在 5 秒后触发。如果您禁用/处置已经存在的计时器,其他计时器将停止。

  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;

  }
于 2013-08-16T04:18:53.060 回答