Вызов дросселя из нескольких источников в один метод - PullRequest
0 голосов
/ 21 сентября 2018

Я немного озадачен, потому что мне трудно найти какую-либо подходящую информацию для моего вопроса.Я очень плохо знаком с System.Reactive, поэтому, возможно, я его неправильно использую.

У меня есть ряд объектов, которые все вызывают статический метод во время события.Я хочу ограничить вызовы этим методом.

public class MyObject
{
    public MyObject ()
    {    
        var observable = Observable.FromEventPattern<SizeChangedEventHandler, SizeChangedEventArgs>
            (handler => SizeChanged += handler, handler => SizeChanged -= handler);
        observable.Throttle (TimeSpan.FromMilliseconds (100));
        observable.Subscribe (x =>
        {
            MethodToCall (this);
        });    
    }

    static void MethodToCall (MyObject obj)
    {
        // Do something.
    }
}

Теперь это, очевидно, не работает, потому что он только ограничивает вызовы от этого единственного объекта, которые происходят намного реже, чем 100 мс.То, что мне нужно, - это какая-то статическая наблюдаемая, которая накапливает все вызовы, а затем отправляет вызов через 100 мс.Кто-нибудь может дать мне несколько советов?

Обновление: я реализовал его с помощью секундомера, который также, кажется, делает эту работу.Мне все еще интересно узнать о реактивном решении.

private static Stopwatch sw = new Stopwatch();

private static void MethodToCall(MyObjectv)
{
    if (sw.ElapsedMilliseconds < 100 && sw.IsRunning)
    {
        return;
    }

    // Some code here

    if (sw.IsRunning)
    {
        sw.Restart();
    }
    else
    {
        sw.Start();
    }
}

1 Ответ

0 голосов
/ 22 сентября 2018

Вместо этого вы можете использовать наблюдаемое в реализации метода MethodToCall:

private static Subject<MyObject> subject = new Subject<MyObject>();
private static IDisposable subscription = subject
    .Throttle (TimeSpan.FromMilliseconds (100))
    .Subscribe(v =>
        {
            // Some code here
        });

private static void MethodToCall(MyObject v)
{
    subject.OnNext(v);
}

Затем регулирование становится внутренней деталью реализации MethodToCall.

...