我需要实现一个同样基于时间的消息缓冲系统。
我需要做的是存储我的类的实例,然后在我达到 100 个实例或 1 分钟后发送它们。
基本上:
List<Message> messages;
public void GotNewMessage(Message msg)
{
messages.add(msg);
if (messages.count() == 100 || timer.elapsed(1 minute))
{
SendMessages(messages);
messages.clear()
}
}
我似乎无法弄清楚如何在不过度使用锁的情况下实现这一点,这会大大减慢进程。有谁知道实现这种系统的好方法?提前致谢。
最佳答案
有一个很棒的库可以满足这些需求(将时间与序列结合起来),它就是 Reactive Extensions。参见 https://github.com/Reactive-Extensions/Rx.NET
然后你可以这样写
void Main()
{
messages
.Buffer(TimeSpan.FromMinutes(1), 100) // Buffer until 100 items or 1 minute has elapsed, whatever comes first.
.Subscribe(msgs => SendMessages(msgs));
}
Subject<Message> messages = new Subject<Message>();
public void GotNewMessage(Message msg)
{
messages.OnNext(msg);
}
注意:这还没有准备好生产,但它展示了如何做的基础知识。根据您获取消息的位置,有更好的方法来创建要订阅的 Observable。
更多引用:
如果您的消息是使用事件接收的,您可以将事件链接到 RX 流,请参阅 https://msdn.microsoft.com/en-us/library/hh242978(v=vs.103).aspx和 https://msdn.microsoft.com/en-us/library/system.reactive.linq.observable.fromeventpattern(v=vs.103).aspx
关于C# .NET - 带定时器的缓冲消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884407/