我想用反應式擴展(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