Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反应式节流阀返回时间跨度内添加的所有项目_C#_System.reactive - Fatal编程技术网

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=>…
)来发布流,以避免订阅两次冷的可观察对象吗?