我想用反应式扩展(RX)和NCrontab创建可观察序列。该顺序与Observable.Timer()
之类的不同之处在于期限和到期时间不固定。在阅读this article之后,似乎Observable.Generate()
就是要走的路。我正在考虑两种变体:一种在边界内运行,另一种永远运行。这些实现是否有意义?Cron Observable Sequence
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 2014-10-28 00:36:51
已更新。我遇到了测试该功能的问题。一旦'IScheduler'介入,我似乎错过了一些东西。 – 2014-10-28 00:53:08