我有一个非常闲聊的序列,并且我试图通过分批处理事件来使其更有效率。具有时间和计数条件的Buffer运算符似乎很符合我的要求,只是有一点细微差别。使用此重载时,订阅将在指定的时间延迟后得到通知,无论缓冲区中是否有任何项目。这真的很烦人,因为大多数时候我的订阅都从缓冲区操作符获取一个空列表。考虑到订户位于UI线程上是一个多线程应用程序,因此它并不是批量处理项目的最佳方法。我想知道是否有一种方法可以使用可用的运算符来创建一个序列,该序列将在缓冲区中存在一定数量的项目时或经过一定时间时触发,但是当且仅当其中有任何项目时才触发缓冲区。我知道我可以做这样的事情:
sequence.Buffer(TimeSpan.FromSeconds(5), 1).Where(e=>e.Count > 0)
但是我想知道是否还有另一种方法可以这样做,因为某种原因,我觉得这不是最好的方法。
最佳答案
我看不出有什么担心的理由-您有一个惯用的解决方案。空缓冲区是信息,因此框架实现将其返回是合理的。无论如何,任何其他方法都将有效地完成您内部的同一件事。
当我发现自己使用小组的标准运算符时,我经常将它们包装在更具解释性的扩展方法中。例如。:
public static class ObservableExtensions
{
public static IObservable<IList<T>> ToNonEmptyBuffers<T>(
this IObservable<T> source,
TimeSpan timespan,
int count,
IScheduler scheduler = null)
{
scheduler = scheduler ?? Scheduler.Default;
return source.Buffer(timespan, count, scheduler ?? Scheduler.Default)
.Where(buffer => buffer.Count > 0);
}
}
允许:
sequence.ToNonEmptyBuffers(TimeSpan.FromSeconds(5), 1);
关于c# - 具有计数和时间条件的缓冲运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22867079/