延迟方法调用

本文关键字:调用 方法 延迟 | 更新日期: 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桶算法。