首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逆Observable.Throttle

逆Observable.Throttle
EN

Stack Overflow用户
提问于 2014-06-12 10:21:12
回答 2查看 238关注 0票数 1

我正在寻找一个可观察的扩展方法来做一个反向节流。我的意思是让第一项通过,然后忽略在适当时间内跟随这些项的项。

代码语言:javascript
复制
input - due time 2
|*.*.*..*..|
output
|*......*..|

请注意,这是一个与下面的问题不同的问题(这些问题都是相同的)。下面的问题需要一个固定的抑制持续时间,而我需要一个抑制持续时间增加,每次新的项目到达太早。从视觉上看,下列解决方案的输出如下:

代码语言:javascript
复制
input - due time 2
|*.*.*..*..|
output
|*...*..*..|

更新

我想出了以下解决方案,但是我对调度程序和并发性还不太了解,无法确定锁定是否足够好。当Scheduler参数被添加到该方法时,我也不知道如何实现该方法。

代码语言:javascript
复制
    public static IObservable<T> InverseThrottle<T>(this IObservable<T> source, TimeSpan dueTime)
    {
        IDisposable coolDownSupscription = null;
        object subscriptionLock = new object();

        return source
            .Where(i =>
            {
                lock (subscriptionLock)
                {
                    bool result;
                    if (coolDownSupscription == null)
                    {
                        result = true;
                    }
                    else
                    {
                        coolDownSupscription.Dispose();
                        result = false;
                    }

                    coolDownSupscription = Observable
                            .Interval(dueTime)
                            .Take(1)
                            .Subscribe(_ =>
                            {
                                lock (subscriptionLock)
                                {
                                    coolDownSupscription = null;
                                }
                            });
                    return result;
                }
            });
    }
EN

回答 2

Stack Overflow用户

发布于 2014-06-13 00:28:35

你可以用这样的东西..。

代码语言:javascript
复制
source
    .GroupByUntil(
        x => Unit.Default,
        x => x.Throttle(TimeSpan.FromSeconds(100))
    )
    .SelectMany(
        x => x.ToList().Take(1) // yields first item on completion of the observable.
    );
票数 3
EN

Stack Overflow用户

发布于 2014-07-30 07:36:04

我建议这个。

代码语言:javascript
复制
public static class IObservable_FirstThenThrottle
{
    public static IObservable<TSource> FirstThenThrottle<TSource>(this IObservable<TSource> source, TimeSpan dueTime)
    {
        var first = source.Take(1);
        var second = source.Skip(1).Throttle(dueTime);
        return first.Merge(second);
    }
}

当第一个项目出现时,它就会触发。然后用dueTime节流剩余的序列。

这是一个大理石图,显示了dueTime = 2发生了什么。

代码语言:javascript
复制
source 0-1-2--3--|
result 0------2--3--|
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24182015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档