gpt4 book ai didi

C# .NET - 带定时器的缓冲消息

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:05 25 4
gpt4 key购买 nike

我需要实现一个同样基于时间的消息缓冲系统。

我需要做的是存储我的类的实例,然后在我达到 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).aspxhttps://msdn.microsoft.com/en-us/library/system.reactive.linq.observable.fromeventpattern(v=vs.103).aspx

关于C# .NET - 带定时器的缓冲消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com