为什么不使用BufferClosingSelector的Observable.Buffer工作

时间:2014-09-19 22:32:42

标签: c# system.reactive reactive-programming

修改

关闭这个,因为我是白痴并且没有意识到我的GetLogEntries()方法是错误的:我在那里做了一些时间计算,而不是使用{{ 1}},我正在使用TimeSpan.TotalMilliSeconds。 呀。

原始问题:

鉴于以下4种方法,其中3种方法工作得很好,但最后一种方法没有,我无法弄清楚为什么最后一种方法没有。

  • Case1()有效:只是缓冲具有给定TimeStamp的事件
  • Case2()有效:使用bufferClosingSelector
  • 使用Observable缓冲事件
  • Case3()有效:只是用给定的TimeStamp缓冲事件
  • Case4() 不起作用: 使用bufferClosingSelector
  • 使用Observable缓冲事件

我无法弄清楚TestCase4()无法正常工作的原因。我错过了什么吗?

TimeSpan.Milliseconds

1 个答案:

答案 0 :(得分:3)

你正在试验的Buffer()的两个重载的实现(不出所料)完全不同 - 但我认为这是一个红色的鲱鱼。根据您使用它们的方式,结果应该相同。

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

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

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

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

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