编辑:
结束这一次是因为我是一个白痴,没有意识到我的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()
,该实例可能在Case3
和Case4
之间共享。我强烈怀疑是这种情况,并且您对GetLogEntries()
的调用不是幂等的,并且会产生副作用,导致第二次调用不返回任何条目。它是否每次都会返回最新未报告的日志条目?