#realJSOP Ответов: 1

System. reactive timer-как изменить интервал на лету?


Я разрабатываю следующую (упрощенную версию) класса с системой.Реактивный. Прямо сейчас он тикает каждые 1 секунду, но в попытке уменьшить нагрузку на процессор я хочу вычислить следующую интересующую меня дату-время и соответственно установить новый интервал. Этот новый интервал может отличаться или не отличаться от текущего заданного интервала. Вот аннотированный класс:

public class Class1
{
    public IObservable<long> Timer;
    public IDisposable       TimerSub;
    DateTime                 NextTime = new DateTime(0);

    public Class1()
    {
        this.NextTime = new DateTime(0);
        this.Timer    = Observable.Timer(TimeSpan.FromSeconds(1));
        this.TimerSub = this.Timer.Subscribe(x => DoWork());
    }

    private void DoWork()
    {
        bool canWork = (this.NextTime.Ticks != 0);
        this.NextTime = this.CalculateFutureDate();

        // change the timer interval to  "this.NextTime - DateTime.Now"
        // how do I do this?

        if (canWork)
        {
            // Do some work stuff...
        }
    }

    private DateTime CalculateFutureDate()
    {
        return DateTime.Now.AddDays(1);
    }
}


Что я уже пробовал:

погуглил, но ничего не нашел, что имело бы хоть какой-то смысл.

Kornfeld Eliyahu Peter

С "нормальным" таймером вы должны остановиться и снова запустить его, если хотите изменить интервал...
Я думаю, что в этом случае вам придется заново создать наблюдаемое (и подписку)...
(Также обратите внимание на разницу между таймером и интервалом)

#realJSOP

Вы не можете запустить/остановить наблюдаемое.Таймер. Для этого нет никакой функциональности

Kornfeld Eliyahu Peter

Конечно-потому что это не "настоящий" таймер... Вот почему я думаю, что вы должны воссоздать (создать новое) наблюдаемое...
это.В следующий раз = это.CalculateFutureDate();
этот.Таймер = Наблюдаемый.Таймер (TimeSpan. FromSeconds([your-computation]));
этот.TimerSub = это.Timer. Subscribe(x = & gt; DoWork());

#realJSOP

Это был самый простой способ подойти к нему, и он, кажется, работает нормально, но это не так удобно, как иметь метод, который устанавливает интервал (или период) в новое значение.

Kornfeld Eliyahu Peter

Я думаю, что в случае наблюдаемого это неудивительно...
По идее вы создаете наблюдаемое и оставляете его в покое, и, возможно, никогда не увидите его снова, если условия не будут выполнены... И наблюдаемое может иметь только одно (сколь бы сложным оно ни было) условие для выполнения... И в вашем случае наблюдаемое фактически выходит из любой области действия в тот момент, когда условие выполнено (таймер-как вы его используете-это одноразовый таймер)...
Поэтому я не удивляюсь, что вы не можете дотянуться до наблюдаемого и изменить его...

1 Ответов

Рейтинг:
7

#realJSOP

В конце концов я заново воссоздал IObservable и повторная подписка, как было предложено выше. Мне не нравилось делать это таким образом, но это самый разумный способ справиться с проблемой.