Я хотел бы создать наблюдаемую последовательность с использованием реактивных расширений (RX) и NCrontab. Последовательность будет отличаться от примерно Observable.Timer()
тем, что период и время не установлены. После прочтения this article кажется, что Observable.Generate()
- это путь. Я имею в виду два варианта: один, который проходит в пределах границ и один, который работает вечно. Имеют ли смысл эти реализации?Наблюдаемая последовательность Cron
public static IObservable<DateTime> Cron(string cron)
{
var schedule = CrontabSchedule.Parse(cron);
return Observable.Generate(DateTime.Now, d=>true, d => DateTime.Now, d => d,
d => new DateTimeOffset(schedule.GetNextOccurrence(d)));
}
public static IObservable<DateTime> Cron(string cron, DateTime start, DateTime end)
{
var schedule = CrontabSchedule.Parse(cron);
return Observable.Generate(start, d => d < end, d => DateTime.Now, d => d,
d => new DateTimeOffset(schedule.GetNextOccurrence(d)));
}
обновление: Это похоже на работу эмпирически, однако я добавил перегрузку, которая принимает IScheduler
и не может показаться, чтобы получить последовательность, чтобы вызвать в модульном тесте. Я использую TestScheduler
неправильно или есть проблема с реализацией функции?
public static IObservable<int> Cron(string cron, IScheduler scheduler)
{
var schedule = CrontabSchedule.Parse(cron);
return Observable.Generate(0, d => true, d => d + 1, d => d,
d => new DateTimeOffset(schedule.GetNextOccurrence(scheduler.Now.DateTime)), scheduler);
}
[TestClass]
public class EngineTests
{
[TestMethod]
public void TestCron()
{
var scheduler = new TestScheduler();
var cron = "* * * * *";
var values = new List<int>();
var disp = ObservableCron.Cron(cron, scheduler).Subscribe(values.Add);
scheduler.AdvanceBy(TimeSpan.TicksPerMinute - 1);
scheduler.AdvanceBy(1);
scheduler.AdvanceBy(1);
Assert.IsTrue(values.Count> 0);
}
}
они имеют смысл для меня. Это действительно ваш вопрос? – Enigmativity
Обновлено. У меня проблема с тестированием функции. Кажется, я что-то упускаю, когда участвует «IScheduler». –