C# 反应式节流阀返回时间跨度内添加的所有项目
给定一个C# 反应式节流阀返回时间跨度内添加的所有项目,c#,system.reactive,C#,System.reactive,给定一个IObservable是否有方法使用Throttle行为(在添加项目时重置计时器,但让它返回该时间内添加的所有项目的集合 Buffer提供了一种类似的功能,它可以在每次时间跨度或计数时将数据分块到IList。但每次添加项目时,我都需要这段时间来重置 我在这里看到了一个类似的问题,但答案似乎并不理想,而且它有点旧,所以我想知道Rx Main的发行版现在是否支持这种开箱即用的功能。它是否可以工作 与我一样,是的,你可以!使用可观察的的节流阀和窗口方法: public static IObse
IObservable
是否有方法使用Throttle
行为(在添加项目时重置计时器,但让它返回该时间内添加的所有项目的集合
Buffer
提供了一种类似的功能,它可以在每次时间跨度或计数时将数据分块到IList
。但每次添加项目时,我都需要这段时间来重置
我在这里看到了一个类似的问题,但答案似乎并不理想,而且它有点旧,所以我想知道Rx Main的发行版现在是否支持这种开箱即用的功能。它是否可以工作
与我一样,是的,你可以!使用可观察的的节流阀和窗口方法:
public static IObservable<IList<T>> BufferUntilInactive<T>(this IObservable<T> stream, TimeSpan delay)
{
var closes = stream.Throttle(delay);
return stream.Window(() => closes).SelectMany(window => window.ToList());
}
公共静态IObservable BufferUntilliActive(此IObservable流,时间跨度延迟)
{
var关闭=流量节流阀(延迟);
返回stream.Window(()=>关闭)。选择many(Window=>Window.ToList());
}
我通过添加一个Publish
组件修改了Colonel Panic的操作符,这样它也可以正确地处理冷观测值:
/// <summary>Projects each element of an observable sequence into consecutive
/// non-overlapping buffers, which are produced based on time and activity.</summary>
public static IObservable<IList<T>> BufferUntilInactive<T>(
this IObservable<T> source, TimeSpan dueTime)
{
return source.Publish(published =>
published
.Window(() => published.Throttle(dueTime))
.SelectMany(window => window.ToList())
);
}
///将可观察序列的每个元素投影到连续的
///非重叠缓冲区,基于时间和活动生成。
公共静态IObservable BufferUntilliActive(
此IObservable源,TimeSpan(时间)
{
返回source.Publish(published=>
出版
.Window(()=>published.Throttle(双时间))
.SelectMany(window=>window.ToList())
);
}
no,时间组件将立即启动并缓冲所有内容,直到时间过去,计数将缓冲n个项目。添加项目时,我需要缓冲时间重置(如油门).听起来我的BufferWithInactivity
回答是你想要的。你能澄清你的问题吗?@Enigmativity是的,这正是我想要的功能。我在问题中提到了这个问题:)但我不喜欢这个答案,回答者已经明确表示这是正在进行的工作。不确定你在问什么。如果每次“添加”(传播?)一个项目时计时器都被重置,那么首先会有什么东西需要缓冲?回答得好!但是不应该使用return stream.publish(hot=>…
)来发布流,以避免订阅两次冷的可观察对象吗?