我需要实现一个也是基于时间的消息缓冲系统。
我需要做的是存储我的类的实例,然后在达到 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 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);
}
Note:这还没有准备好投入生产,但它展示了如何做到这一点的基本方法。根据您收到消息的位置,有更好的方法来创建要订阅的 Observable。
更多参考:
- http://www.introtorx.com/ http://www.introtorx.com/
- https://msdn.microsoft.com/en-us/library/hh242985(v=vs.103).aspx https://msdn.microsoft.com/en-us/library/hh242985(v=vs.103).aspx
如果您的消息是使用事件接收的,您可以将该事件链接到 RX 流,请参阅https://msdn.microsoft.com/en-us/library/hh242978(v=vs.103).aspx https://msdn.microsoft.com/en-us/library/hh242978(v=vs.103).aspx and https://msdn.microsoft.com/en-us/library/system.reactive.linq.observable.fromeventpattern(v=vs.103).aspx https://msdn.microsoft.com/en-us/library/system.reactive.linq.observable.fromeventpattern(v=vs.103).aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)