Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 鼠标滚轮和检查更改值事件之间的延迟_C#_Winforms - Fatal编程技术网

C# 鼠标滚轮和检查更改值事件之间的延迟

C# 鼠标滚轮和检查更改值事件之间的延迟,c#,winforms,C#,Winforms,对于轨迹栏和数字向上/向下(除其他外),似乎是在值更改时触发的事件在更改之间有很短的延迟 这给我带来了一个问题,因为每当值发生变化时,我都会执行一些需要相当长时间处理的函数(例如,大约100-200毫秒,取决于输入的大小) 我注意到,当我使用鼠标滚轮增加/减少值时,它会注册4个更改事件(向调试控制台打印“changed!”4次),因此函数会执行4次。这可能是我的鼠标滚轮的设置 即使我手动点击轨迹栏,使其“大幅增加”,它也会记录2个更改事件 我希望函数在值发生变化时运行,但不要到一个鼠标滚轮滚动触

对于轨迹栏和数字向上/向下(除其他外),似乎是在值更改时触发的事件在更改之间有很短的延迟

这给我带来了一个问题,因为每当值发生变化时,我都会执行一些需要相当长时间处理的函数(例如,大约100-200毫秒,取决于输入的大小)

我注意到,当我使用鼠标滚轮增加/减少值时,它会注册4个更改事件(向调试控制台打印“changed!”4次),因此函数会执行4次。这可能是我的鼠标滚轮的设置

即使我手动点击轨迹栏,使其“大幅增加”,它也会记录2个更改事件

我希望函数在值发生变化时运行,但不要到一个鼠标滚轮滚动触发4个调用的程度。我只需要最新的值


一种解决方案是强制用户手动按下按钮来执行命令,但我希望进行某种“实时”更新。

让数控的事件设置一个标志。添加一个
定时器
控件,每500毫秒运行一次,该控件检查标志,如果设置,则调用实际方法并清除标志。如果要确保处理最后的值集,请先清除标志。

扩展Jon of All Trade的建议

使用
DateTime?
代替简单的标志。当事件激发时,设置
eventLastTriggered=DateTime.Now
。然后在计时器的勾号处理程序中执行此操作

private void timer_Tick(object sender, EventArgs e)
{
    if (eventLastTriggered.HasValue
        && (DateTime.Now - eventLastTriggered.Value) >= UpdateDelay)
    {
        eventLastTriggered = null; // reset it so we don't update again
        Update();
    }
}

static readonly TimeSpan UpdateDelay = TimeSpan.FromMilliseconds(whatever);

您将获得持续的更新延迟,但不会收到更新垃圾邮件。您可以调整UpdateDisplay以获得最佳效果。

谢谢,使用显式计时器是一种有趣的方法。