为什么 DispatcherTimer 会立即启动而不是等到间隔出现?

Why does the DispatcherTimer start immediatly instead of waiting until the interval arise?

我想使用 DispatcherTimer 来决定用鼠标单击是单击还是双击。我在 this thread.

中使用 mm8 的解决方案

我的测试代码是这个:

DispatcherTimer _myTimer = new DispatcherTimer();

public Constructor()
{
    _myTimer.Interval = new TimeSpan(1000);
    _myTimer.Tick += OnOneClickTick;
}

private void OnPreviewMouseLeftButtonDownCommand(MouseButtonEventArgs e)
{
    try
    {
        if(e.ClickCount == 2)
        {
            _myTimer.Stop();
            string dummy = "";
        }
        else
        {
            _myTimer.Start();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("error");
    }
}

private void OnOneClickTick(object sender, System.EventArgs e)
{
    _myTimer.Stop();
    string dummy = "";
}

想法是,当我点击一次时,启动计时器,但还没有执行,等第二次点击,如果没有发生,然后 运行 itmer 处理程序,如果发生了,停止定时器,这样定时器就不会被执行。

但是,当我在单击鼠标事件中启动计时器时,计时器处理程序会立即执行。我认为定时器处理程序的代码将在间隔出现后执行,在 1 秒后(1 秒有时间测试它是否有效,以后 250 毫秒是一个很好的间隔)。

这是为什么?

您正在使用的 TimeSpan 的构造函数是 the one that takes a number of ticks 作为参数。所以你基本上设置了 1000 个刻度的间隔,即 0.0001 秒,所以 似乎 立即调用回调,但事实并非如此。

您应该改用 TimeSpan.FromMilliseconds