如何清除ReplaySubject上的缓冲区?

编码英雄

如何清除上的缓冲区ReplaySubject

我需要定期清除缓冲区(在我的情况下,作为一天结束的事件),以防止ReplaySubject持续增长并最终耗尽所有内存。

理想情况下,我希望保持相同,ReplaySubject因为客户端订阅仍然很好。

詹姆斯世界

ReplaySubject 没有提供清除缓冲区的方法,但是有几种重载以不同的方式约束其缓冲区:

  • 最多TimeSpan保留的项目
  • 最大项目数
  • 上述各项的组合,一旦满足任一条件,即丢弃项目。

一个可清除的重放对象

这是一个很有趣的问题-我决定看看这将是多么容易实现的变化的ReplaySubject,你可以明确的-使用现有的科目和运营商(因为这些是相当强劲)。事实证明,这是相当简单的。

我已经通过内存探查器运行它来检查它是否做对了。调用Clear()以刷新缓冲区,否则它就像常规的无界的一样工作ReplaySubject

public class RollingReplaySubject<T> : ISubject<T>
{
    private readonly ReplaySubject<IObservable<T>> _subjects;
    private readonly IObservable<T> _concatenatedSubjects;
    private ISubject<T> _currentSubject;

    public RollingReplaySubject()
    {
        _subjects = new ReplaySubject<IObservable<T>>(1);
        _concatenatedSubjects = _subjects.Concat();
        _currentSubject = new ReplaySubject<T>();
        _subjects.OnNext(_currentSubject);
    }

    public void Clear()
    {
        _currentSubject.OnCompleted();
        _currentSubject = new ReplaySubject<T>();
        _subjects.OnNext(_currentSubject);
    }

    public void OnNext(T value)
    {
        _currentSubject.OnNext(value);
    }

    public void OnError(Exception error)
    {
        _currentSubject.OnError(error);
    }

    public void OnCompleted()
    {
        _currentSubject.OnCompleted();
        _subjects.OnCompleted();     
        // a quick way to make the current ReplaySubject unreachable
        // except to in-flight observers, and not hold up collection
        _currentSubject = new Subject<T>();       
    }

    public IDisposable Subscribe(IObserver<T> observer)
    {
        return _concatenatedSubjects.Subscribe(observer);
    }
}

遵守常规规则(与任何规则一样Subject),不要同时调用此类的方法-包括Clear()如果需要,您可以轻松添加同步锁。

它通过在主ReplaySubject中嵌套一系列ReplaySubject来工作。外部的ReplaySubject(_subjects)保留一个正好是内部的ReplaySubject(_currentSubject的缓冲区,并在构造时填充该缓冲区

这些OnXXX方法调用_currentSubjectReplaySubject。

观察者订阅了嵌套的ReplaySubjects的串联投影(保存在中_concatenatedSubjects)。因为的缓冲区大小_subjects仅为1,所以新订户仅获取最近的事件ReplaySubject

每当我们需要“清除缓冲区”时,现有的将_currentSubjectOnCompleted一个新的ReplaySubject被添加到其中_subjects并成为新的_currentSubject

增强功能

按照@Brandon的建议,我创建了一个版本,RollingReplaySubject版本使用aTimeSpan或输入流来表示缓冲区清除。我在这里为此创建了一个Gist:https : //gist.github.com/james-world/c46f09f32e2d4f338b07

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python中的Memset(),清除缓冲区

来自分类Dev

清除键盘缓冲区

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

如何在现代系统上测试缓冲区溢出?

来自分类Dev

清除主机后如何获取控制台缓冲区历史记录?

来自分类Dev

当stdin非交互时如何清除python中的stdin缓冲区

来自分类Dev

如何在Android上更新顶点缓冲区?

来自分类Dev

如何使用ZPL II清除缓冲区[Zebra GK420d]

来自分类Dev

清除cout缓冲区(C ++)

来自分类Dev

如何报告Windows上的堆栈缓冲区超限?

来自分类Dev

如何清除(用随机字节覆盖)std :: string内部缓冲区?

来自分类Dev

如何停止清除清除回滚缓冲区的“清除”

来自分类Dev

如何停止清除命令缓冲区之间的内容?

来自分类Dev

强制在scanf中清除缓冲区

来自分类Dev

清除MIDI输出缓冲区

来自分类Dev

Python中的Memset(),清除缓冲区

来自分类Dev

在金属中如何清除深度缓冲区或模板缓冲区?

来自分类Dev

如何在Linux上获取相机缓冲区?

来自分类Dev

如何删除Emacs缓冲区上的文件修改跟踪?

来自分类Dev

Python:清除标准输入缓冲区

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

如何从bash清除konsole中的回滚缓冲区?

来自分类Dev

如何更改CentOS7上“清除”的行为,使其不会清除xterm上的回滚缓冲区?

来自分类Dev

如何停止清除清除回滚缓冲区的“清除”

来自分类Dev

如何清除Neovim缓冲区

来自分类Dev

Tmux,禁用缓冲区清除功能

来自分类Dev

如何在屏幕上查看 GLuints 的渲染缓冲区?

来自分类Dev

读取c中的输入后如何清除缓冲区?

来自分类Dev

如何让 cout 缓冲区在 ubuntu 上刷新

Related 相关文章

热门标签

归档