private Task ScheduleNextAsync() { if (!_running) { return(Task.CompletedTask); } DateTimeOffset?next = _cronExpression.GetNextValidTimeAfter(DateTimeOffset.Now); if (next.HasValue) { DateTime utc = next.Value.UtcDateTime; DateTime now = DateTime.UtcNow; TimeSpan span = utc - now; if (!_running) { return(Task.CompletedTask); } _sub = _scheduler.Schedule(_action, span); #if DEBUG Console.WriteLine(span); #endif } return(Task.CompletedTask); }
/// <summary> /// Schedule an action at a DateTime with an interval /// </summary> /// <param name="scheduler"></param> /// <param name="action"></param> /// <param name="when"></param> /// <param name="interval"></param> /// <returns></returns> public static IDisposable Schedule(this IAsyncScheduler scheduler, Func <Task> action, DateTime when, TimeSpan interval) => scheduler.Schedule(action, when - DateTime.Now, interval);
/// <summary> /// Schedule an action at a DateTime /// </summary> /// <param name="scheduler"></param> /// <param name="action"></param> /// <param name="when"></param> /// <returns></returns> public static IDisposable Schedule(this IAsyncScheduler scheduler, Func <Task> action, DateTime when) => scheduler.Schedule(action, when - DateTime.Now);