延迟方法调用

时间:2016-08-13 09:35:17

标签: c#

我对特定实体可能发生的事件发生率很高,我需要通过网络传输它们。问题是这些事件会产生高水平的流量和计算,这是不可取的。

所以我的问题是什么是在特定时间内延迟执行计算功能的最佳方法。在我的情况下,事件没有我需要缓冲或发生顺序的任何实际数据,所以基本上它只是在事件发生时启动计时器并且一旦延迟到期就用实体参数激活它。

我可以使用计时器构建我自己的实现,但似乎已经有人应该支持它,例如反应式扩展?

在任何情况下,如果有人可以指出我现有的实施或框架,将不胜感激。

修改

好的,我已经看过RX可观察模式,看起来它可以完成这项工作。我可以看到一个简单的实现,我可以使用,例如

 IDisposable handlers;
        Subject<int> subject = new Subject<int>();
        handlers = subject.AsObservable().Sample(TimeSpan.FromSeconds(10))
            .Subscribe(sample =>
        {
            Trace.WriteLine(sample);
        });

现在每当我想要处理事件时,我都会打电话给

subject.OnNext(someValue);

示例应该延迟对订阅者的呼叫。 如果我对这种用法不对,有人会评论吗?

2 个答案:

答案 0 :(得分:0)

以下是您可以做的示例:

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);
    }
}

你可以创建一个集合来保存你收到的所有事件,一旦你可以触发集合中的所有事件,因为我们使用字典我们只能保存最后一个事件所以我们不会必须保存你得到的所有事件。

答案 1 :(得分:0)

我建议你研究一下Proxy design pattern。您的客户端只会知道代理服务器上的代理和触发事件。您的Proxy对象将包含确定何时通过线路发送实际请求的逻辑。这个逻辑可能取决于您的要求。根据我的理解,拥有布尔开关isEventRaised并在可配置的时间间隔内检查它可能满足您的要求(您将在此间隔结束时将标志重置为false。)

此外,您可以先检查Throttling实施,然后尝试确定它们是否符合您的要求。例如,这里是关于不同限制方法的StackOverflow question,其中引用了Token bucket algorithm