为什么 Observable.Buffer with bufferClosesingSelector 不起作用



编辑:

结束这一次是因为我是一个白痴,没有意识到我的GetLogEntries()方法有缺陷:我在那里做了一些时间计算,而不是使用TimeSpan.TotalMilliSeconds,而是使用TimeSpan.Milliseconds。是 啊

原始问题:

给定以下4种方法,其中3种方法第一种很好,但最后一种不好,我不明白为什么最后一种方法不好。

  • Case1()有效:只缓冲具有给定时间戳的事件
  • Case2()工作:使用Observable缓冲事件,使用bufferClosingSelector
  • Case3()有效:只缓冲具有给定时间戳的事件
  • Case4()不起作用:使用bufferClosingSelector用Observable缓冲事件

我只是不明白为什么TestCase4()不起作用。我是不是错过了什么?

public void Case1()
{
    var a = Observable.Interval(TimeSpan.FromSeconds(1));
    var b = a.Buffer(TimeSpan.FromSeconds(1));
    b.Subscribe(x =>
    {
        // yep, this is called every second
    });
}
public void Case2()
{
    var a = Observable.Interval(TimeSpan.FromSeconds(1));
    var b = a.Buffer(() => Observable.Interval(TimeSpan.FromSeconds(1)));
    b.Subscribe(x =>
    {
        // yep, this is also called every second
    });
}
public void Case3()
{
    IObservable<LogEntry> source = this.LogsProvider.GetLogEntries();
    var buffered = source.Buffer(TimeSpan.FromSeconds(1));
    buffered.Subscribe(logentriesList =>
    {
        // yep, I get an IList<LogEntry> each second.
    });
}
public void Case4()
{
    IObservable<LogEntry> source = this.LogsProvider.GetLogEntries();
    var buffered = source.Buffer(() => Observable.Interval(TimeSpan.FromSeconds(1)));
    buffered.Subscribe(logentriesList =>
    {
        // nope, I never get here.. Why ? Case3() works as expected... 
        // Isn't this just the same as Case2() vs Case1(), where Case2() actually works? 
    });
}

您正在试验的Buffer()的两个重载的实现(毫不奇怪)有很大不同,但我认为这只是转移注意力。考虑到你使用它们的方式,结果应该是一样的。

正如Dave Sexton在评论中暗示的那样,您显示的代码省略了两个重要部分:

  • GetLogEntries()的实现
  • 调用各种Case<n>方法

如果Buffer的实现被破坏,我会非常惊讶。此外,您所显示的代码正确地调用了Buffer重载。

因此,最可能的解释是问题出在省略的代码中。

我注意到您在一个实例(this.LogsProvider)上调用GetLogEntries(),该实例可能在Case3Case4之间共享。我强烈怀疑是这种情况,并且您对GetLogEntries()的调用不是幂等的,并且会产生副作用,导致第二次调用不返回任何条目。它是否每次都会返回最新未报告的日志条目?

相关内容

  • 没有找到相关文章

最新更新