为什么DispatcherTimer Tick事件没有按时发生?

时间:2011-09-27 09:58:42

标签: c#

我想禁用一个按钮 - 以防止双击:在平板电脑上你按一次,它点击了两次,这是我知道的最简单的黑客 - 一小段时间但是我注意到了/调试间隔在实践中可能太长; 50 ms vs> 2秒。

只有一行启动计时器,一行停止计时器。随机间隔为50毫秒或更大。没有CPU消耗,我只需在我的4核桌面PC上单击鼠标按钮。

原因是什么?

    DispatcherTimer timerTouchDelay = new DispatcherTimer();

    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        //Init
        if (timerTouchDelay.Interval.Milliseconds == 0)
        {
            timerTouchDelay.Tick += new EventHandler(timerTouchDelay_Tick);
            timerTouchDelay.Interval = new TimeSpan(0, 0, 0, 0, 50); //ms

        }


        if(timerTouchDelay.IsEnabled)
            return;

        timerTouchDelay.Start();

        HandleKeyDown();
        base.OnMouseDown(e);
    }

    private void timerTouchDelay_Tick(object sender, EventArgs e)
    {
        timerTouchDelay.Stop();
    }

2 个答案:

答案 0 :(得分:2)

要明白为何会出现这种情况,我强烈推荐以下文章:

Comparing the Timer Classes in the .NET Framework Class Library

作为参考,DispatcherTimerSystem.Windows.Forms.Timer非常相似,作者称其为“如果您正在寻找节拍器,那么您来错了地方”。此计时器并非设计为以确切的间隔“打勾”。

答案 1 :(得分:2)

为什么不记录按钮上次按下的时间,而不是运行计时器。如果它超过50毫秒,请继续执行操作,否则只需退出。

DateTime lastMouseDown = DateTime.MinValue;

protected override void OnMouseDown(MouseButtonEventArgs e)
{
    if(DateTime.Now.Subtract(lastMouseDown).TotalMilliseconds < 50)
       return;
    lastMouseDown = DateTime.Now;

    HandleKeyDown();
    base.OnMouseDown(e);
}