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

标签 c# .net linq timer buffering

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

我需要做的是存储我的类的实例,然后在我达到 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/

相关文章:

.net - 选项卡页在 C# (winform) 中添加一个新属性

LINQ递归函数?

c# - 将同步代码包装到异步方法中的最佳方法是什么

c# - 如何排队/等待 TPL 任务完成

c# - 'Newtonsoft.Json.. .' exists in both ' Blend\Newtonsoft.Json.dll' 和 'Solution\packages\...\

带有 XML 结构化数据的 C# HttpWebRequest

c# - SessionState stateConnectionString 和 sqlConnectionString

c# - 如何更改 WPF 中单个选项卡项标题的背景?

c# - LINQ 如何跨多个列表返回公共(public)对象

c# - 如何在 ASP.NET 中找到选定的 RadioButton 的值?