我有一个带鼠标点击事件处理程序的按钮
按下按钮(鼠标按下)时,启动计时器以延迟模拟其他点击。点击运行位图转换,例如每次旋转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;
}
问题是如果转换需要很长时间,则在释放按钮后会再次发生几次转换。
如何抑制剩余?
答案 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;
}
}
}
}