2

クエリの途中で Throttle Timespan 値を拡張することは可能ですか? たとえば、101 Rx Samples Throttleのような例を想定すると、このクエリがありますvar throttled = observable.Throttle(TimeSpan.FromMilliseconds(750));

最初の 500 ミリ秒の間にイベントが発生しないように変更したい場合はどうすればよいでしょうか。たとえば、その後のイベントごとにスロットリング値が 1500 ミリ秒に拡張されます。

Switchこれはオペレーターを使用する場所でしょうか?

4

1 に答える 1

6

ソース イベントを受け取り、 (T は任意の型) でThrottleある "スロットル ストリーム" を生成するファクトリ関数を受け入れるのオーバーロードがあります。IObservable<T>イベントは、スロットル ストリームが発行されるまで抑制されます。

次の例には、0.5 秒のスロットルを生成するスロットル ファクトリを使用して、毎秒ポンピングするストリームがあります。したがって、開始時に、ソース ストリームは調整されません。

2 と入力すると、スロットルが 2 秒のスロットルに変わり、すべてのイベントが抑制されます。1 に下げると、イベントが再び表示されます。

void Main()
{
    var throttleDuration = TimeSpan.FromSeconds(0.5);
    Func<long, IObservable<long>> throttleFactory =
        _ => Observable.Timer(throttleDuration);

    var sequence = Observable.Interval(TimeSpan.FromSeconds(1))
                             .Throttle(throttleFactory);

    var subscription = sequence.Subscribe(Console.WriteLine);

    string input = null;
    Console.WriteLine("Enter throttle duration in seconds or q to quit");
    while(input != "q")
    {       
        input = Console.ReadLine().Trim().ToLowerInvariant();
        double duration;

        if(input == "q") break;
        if(!double.TryParse(input, out duration))
        {
            Console.WriteLine("Eh?");
            continue;
        }
        throttleDuration = TimeSpan.FromSeconds(duration);
    }

    subscription.Dispose();
    Console.WriteLine("Done");
}

これはイベントごとにスロットルを生成するファクトリ関数であるため、特定の入力イベントに基づいてスロットル ストリームを返す、より動的なものを作成できます。

このようなコントロールとして使用されるストリームのアイデアは、Rx API 全体で使用される非常に一般的な手法であり、理解する価値があります。同様の使用例には、 to 、in 、inのother引数が含まれます。TakeUntildurationSelectorGroupByUntilbufferClosingSelectorBuffer

于 2013-10-21T21:52:02.063 に答える