【发布时间】:2015-04-12 21:04:13
【问题描述】:
我正在收听硬件事件消息,但我需要对其进行去抖动以避免太多查询。
这是一个发送机器状态的硬件事件,我必须将其存储在数据库中以用于统计目的,有时它的状态会经常变化(闪烁?)。在这种情况下,我只想存储一个“稳定”状态,我想通过在将状态存储到数据库之前等待 1-2 秒来实现它。
这是我的代码:
private MachineClass connect()
{
try
{
MachineClass rpc = new MachineClass();
rpc.RxVARxH += eventRxVARxH;
return rpc;
}
catch (Exception e1)
{
log.Error(e1.Message);
return null;
}
}
private void eventRxVARxH(MachineClass Machine)
{
log.Debug("Event fired");
}
我将此行为称为“去抖动”:等待几次以真正完成它的工作:如果在去抖动时间内再次触发相同的事件,我必须关闭第一个请求并开始等待去抖动时间以完成第二个事件。
管理它的最佳选择是什么?只是一个一次性计时器?
要解释“去抖动”功能,请查看关键事件的这个 javascript 实现: http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/
【问题讨论】:
-
用秒表测量已经过去的时间。
-
“我必须拒绝第一个请求”——这听起来很成问题。是否有特定原因导致第一个请求无法继续,而随后的请求被忽略?
-
这是一个发送机器状态的硬件事件,我必须将其存储在数据库中以用于统计目的,有时它的状态会经常变化(闪烁?),在这种情况下我想只存储“稳定”状态,我想实现它只需等待 1-2 秒,然后再将状态存储到数据库。也许我可以用计时器来做?如果状态更改太接近,我会等待 1-2 秒来触发重置它的查询。
-
@Damien_The_Unbeliever 这不是一个奇怪的要求,也不是微不足道的。它不能只用一个简单的计时器来处理。不过,响应式扩展确实涵盖了这种情况。
-
一个非常类似的问题是等待 FileSystemWatcher 停止报告更改,例如。在复制大文件时。您会收到很多更改事件,但真的想在 last 事件之后稍等片刻,然后再尝试访问修改后的文件。
标签: c# events debouncing