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