如何在计时器停止时停止剩余动作?

时间:2014-01-23 09:36:14

标签: c# timer


我有一个带鼠标点击事件处理程序的按钮 按下按钮(鼠标按下)时,启动计时器以延迟模拟其他点击。点击运行位图转换,例如每次旋转0.5。
当释放按钮(鼠标向上)时,计时器停止。
按钮类中的代码:

private void TreatMouseDown(object sender, MouseEventArgs e) {
    // Following clicks
    _repeteTimer.Tick += (senderTick, eTick) => {
        _repeteTimer.Stop();
        PerformClick();
        _repeteTimer.Interval = _nextDelay;
        _repeteTimer.Start();
    };
    // First click  
    PerformClick();
    _repeteTimer.Interval = _firstDelay;
    _repeteTimer.Start();
}

private void TreatMouseUp(object sender, MouseEventArgs e) {
    _repeteTimer.Stop();
}

窗口中的代码:

btnRotation1.Click += (sender, e) => PHOTO_Treat(1);

private void PHOTO_Treat(int delta) {
    if (!_inProgress) {
        _photoRotation += delta * 0.5F;
        PHOTO_Show();
    }
}

private void PHOTO_Show(){
    if (_inProgress) return;
_inProgress= true;

    // Make image treatments ...

    _inProgress = false;
}

问题是如果转换需要很长时间,则在释放按钮后会再次发生几次转换。
如何抑制剩余?

1 个答案:

答案 0 :(得分:0)

听起来你有一些严重的线程问题。

您可以通过选中_repeteTimer.Enabled来检查按钮是否仍然按下。

另外,添加一个锁。即使只是为了安全。

private readonly object SyncRoot = new object();

private void PHOTO_Show()
{
    if (!_inProgress)
    {
        // race for a lock
        lock (SyncRoot)
        {
            // check button state
            if (!_repeteTimer.Enabled)
            {
                // button was released
                return;
            }
            // else
            try
            {
                _inProgress = true;
                MakeImageTreatments();
            }
            finally 
            {
                _inProgress = false;
            }
        }
    }
}