延迟方法调用
本文关键字:调用 方法 延迟 | 更新日期: 2023-09-27 18:02:12
我有一个特定实体可能发生的高事件率,我需要通过网络传输它们。问题是这些事件会产生高水平的流量和计算,这是不希望的。
所以我的问题是,将计算函数的执行延迟一段特定时间的最佳方法是什么。在我的情况下,事件没有任何实际的数据,我需要缓冲或发生顺序,所以基本上它将只是启动一个定时器一旦事件发生,并触发它与实体参数一旦延迟过期。
我可以用计时器构建我自己的实现,但似乎已经有应该支持它的,例如响应式扩展?
无论如何,如果有人能指出一个现有的实现或框架,我将不胜感激。
编辑
好的,我已经看了RX的可观察模式,看起来它可以完成这项工作。我可以看到一个简单的实现,我可以使用例如
IDisposable handlers;
Subject<int> subject = new Subject<int>();
handlers = subject.AsObservable().Sample(TimeSpan.FromSeconds(10))
.Subscribe(sample =>
{
Trace.WriteLine(sample);
});
现在每当我想处理事件时,我都会调用
subject.OnNext(someValue);
示例应该延迟对订户的呼叫。有人能评论一下我对这个用法是否正确吗?
你可以这样做:
public class ExpiryDictionarty
{
Timer timer; //will hanlde the expiry
ConcurrentDictionary<string, string> state; //will be used to save the last event
public ExpiryDictionarty(int milisec)
{
state = new ConcurrentDictionary<string, string>();
timer = new Timer(milisec);
timer.Elapsed += new ElapsedEventHandler(Elapsed_Event);
timer.Start();
}
private void Elapsed_Event(object sender, ElapsedEventArgs e)
{
foreach (var key in state.Keys)
{
//fire the calculation for each event in the dictionary
}
state.Clear();
}
public void Add(string key, string value)
{
state.AddOrUpdate(key, value);
}
}
你可以创建一个集合来保存你收到的所有事件,一旦时间流逝,你可以触发集合中的所有事件,因为我们使用的是字典,我们只能保存最后一个事件,所以我们不必保存你得到的所有事件
我建议您查看代理设计模式。您的客户端将只知道代理和代理对象上的触发事件。您的代理对象将包含确定何时通过网络发送实际请求的逻辑。这种逻辑可能取决于您的需求。根据我的理解,拥有一个布尔开关isEventRaised
并在一个可配置的间隔内检查它可能满足您的要求(您将在此间隔结束时将标志重置为false
)。
同样,您可以首先检查Throttling实现,并尝试找出它们是否符合您的需求。例如,这里有一个关于不同Throttling方法的StackOverflow问题,其中引用了Token桶算法。