コード例 #1
0
        private static ScheduledFunction <T> Add <T>(
            bool isFunction,
            [NotNull] ScheduledFunction <T> .SchedulableDueCancellableFunctionAsync function,
            [NotNull] ISchedule schedule,
            int maximumHistory       = -1,
            Duration maximumDuration = default(Duration))
        {
            if (function == null)
            {
                throw new ArgumentNullException("function");
            }
            if (schedule == null)
            {
                throw new ArgumentNullException("schedule");
            }

            ScheduledFunction <T> sf = new ScheduledFunction <T>(
                isFunction,
                function,
                schedule,
                maximumHistory < 1 ? _defaultMaximumHistory : maximumHistory,
                maximumDuration <= Duration.Zero ? _defaultMaximumDuration : maximumDuration);

            // Update actions dictionary
            _actions.AddOrUpdate(sf.ID, sf, (i, a) => sf);

            // Calculate next due
            sf.RecalculateNextDue(Instant.MinValue);
            return(sf);
        }
コード例 #2
0
 /// <summary>
 /// Enables the specified scheduled function.
 /// </summary>
 /// <param name="scheduledFunction">The scheduled function.</param>
 public static void Enable(ScheduledFunction scheduledFunction)
 {
     if (_timers.TryUpdate(scheduledFunction, new Timer(Tick, scheduledFunction, Timeout.Infinite, Timeout.Infinite), null))
     {
         SetTimer(scheduledFunction);
     }
 }
コード例 #3
0
        /// <summary>
        /// Removes the specified scheduled function (if currently in the scheduler).
        /// </summary>
        /// <param name="scheduledFunction">The scheduled function.</param>
        /// <returns>The scheduled function passed in.</returns>
        public static ScheduledFunction Remove(ScheduledFunction scheduledFunction)
        {
            Timer timer;

            if (_timers.TryRemove(scheduledFunction, out timer) && (timer != null))
            {
                timer.Dispose();
            }
            return(scheduledFunction);
        }
コード例 #4
0
        /// <summary>
        /// Enables the specified scheduled function.
        /// </summary>
        /// <param name="scheduledFunction">The scheduled function.</param>
        public static void Disable(ScheduledFunction scheduledFunction)
        {
            Timer timer;

            if ((_timers.TryGetValue(scheduledFunction, out timer)) && (timer != null))
            {
                if (_timers.TryUpdate(scheduledFunction, null, timer))
                {
                    timer.Dispose();
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// Removes the specified scheduled function.
        /// </summary>
        /// <param name="scheduledFunction">The scheduled action.</param>
        /// <returns><see langword="true" /> if removed, <see langword="false" /> otherwise.</returns>
        public static bool Remove <T>([NotNull] ScheduledFunction <T> scheduledFunction)
        {
            if (scheduledFunction == null)
            {
                throw new ArgumentNullException("scheduledFunction");
            }

            ScheduledAction a;
            bool            result = _actions.TryRemove(scheduledFunction.ID, out a);

            Debug.Assert(!result || (a != null && a.ID == scheduledFunction.ID));
            return(result);
        }
コード例 #6
0
        /// <summary>
        /// Ticks every second.
        /// </summary>
        /// <param name="state">The state.</param>
        private static void Tick(object state)
        {
            ScheduledFunction scheduledFunction = state as ScheduledFunction;

            if (scheduledFunction == null)
            {
                return;
            }

            // Check we're still due.
            if (scheduledFunction.NextExecutionDue <= DateTime.Now)
            {
                scheduledFunction.ExecuteNow();
            }

            SetTimer(scheduledFunction);
        }
コード例 #7
0
        public static ScheduledFunction <T> Add <T>(
            [NotNull] ScheduledFunction <T> .SchedulableDueCancellableFunctionAsync function,
            [NotNull] ISchedule schedule,
            int maximumHistory       = -1,
            Duration maximumDuration = default(Duration))
        {
            if (function == null)
            {
                throw new ArgumentNullException("function");
            }
            if (schedule == null)
            {
                throw new ArgumentNullException("schedule");
            }

            return(Add(true, function, schedule, maximumHistory, maximumDuration));
        }
コード例 #8
0
        public static ScheduledFunction <T> Add <T>(
            [NotNull] ScheduledFunction <T> .SchedulableDueFunction function,
            [NotNull] ISchedule schedule,
            int maximumHistory       = -1,
            Duration maximumDuration = default(Duration))
        {
            if (function == null)
            {
                throw new ArgumentNullException("function");
            }
            if (schedule == null)
            {
                throw new ArgumentNullException("schedule");
            }

            return(Add(true, (d, t) => Task.FromResult(function(d)), schedule, maximumHistory, maximumDuration));
        }
コード例 #9
0
        public static ScheduledFunction <T> Add <T>(
            [NotNull] ScheduledFunction <T> .SchedulableCancellableFunctionAsync function,
            [NotNull] string scheduleName,
            int maximumHistory       = -1,
            Duration maximumDuration = default(Duration))
        {
            if (function == null)
            {
                throw new ArgumentNullException("function");
            }
            if (scheduleName == null)
            {
                throw new ArgumentNullException("scheduleName");
            }

            return(Add(true, (d, t) => function(t), GetSchedule(scheduleName), maximumHistory, maximumDuration));
        }
コード例 #10
0
        /// <summary>
        /// Sets the timer for a scheduled function.
        /// </summary>
        /// <param name="scheduledFunction">The scheduled function.</param>
        private static void SetTimer(ScheduledFunction scheduledFunction)
        {
            Timer timer;

            if ((!_timers.TryGetValue(scheduledFunction, out timer)) || (timer == null))
            {
                return;
            }
            DateTime nextDue = scheduledFunction.NextExecutionDue;

            if (nextDue == DateTime.MaxValue)
            {
                // If we're never due again, remove the scheduled function.
                if (_timers.TryRemove(scheduledFunction, out timer) && (timer != null))
                {
                    timer.Dispose();
                }
                return;
            }
            TimeSpan dueIn = nextDue - DateTime.Now;

            timer.Change(dueIn > TimeSpan.Zero ? dueIn : TimeSpan.FromTicks(1), TimeSpan.FromMilliseconds(-1));
        }
コード例 #11
0
        /// <summary>
        /// Adds the specified schedule.
        /// </summary>
        /// <typeparam name="TResult">The type of the result.</typeparam>
        /// <param name="schedule">The schedule.</param>
        /// <param name="function">The function.</param>
        /// <param name="startAfter">The date time to start after.</param>
        /// <param name="maximumHistory">The maximum history.</param>
        /// <param name="enabled">if set to <c>true</c> then the scheduled function is enabled.</param>
        /// <param name="executeImmediately">if set to <c>true</c> executes the function immediately.</param>
        /// <returns>The scheduled function.</returns>
        public static ScheduledFunction <TResult> Add <TResult>(Schedule schedule,
                                                                Func <ScheduledFunction <TResult>, TResult> function,
                                                                DateTime?startAfter = null, int maximumHistory      = ScheduledFunction.DefaultMaximumHistory,
                                                                bool enabled        = true, bool executeImmediately = false)
        {
            ScheduledFunction <TResult> scheduledFunction = new ScheduledFunction <TResult>(
                schedule, function, startAfter ?? DateTime.Now, maximumHistory);

            // If we need to execute, do so now.
            if (executeImmediately)
            {
                scheduledFunction.ExecuteNow();
            }

            // Don't add a scheduled function that is never due
            DateTime nextDue = scheduledFunction.NextExecutionDue;

            // Check if we're ever due
            if (nextDue == DateTime.MaxValue)
            {
                return(scheduledFunction);
            }

            Timer timer = enabled
                               ? new Timer(Tick, scheduledFunction, Timeout.Infinite, Timeout.Infinite)
                               : null;

            _timers.AddOrUpdate(scheduledFunction, timer, (sf, t) => timer);

            if (enabled)
            {
                SetTimer(scheduledFunction);
            }


            return(scheduledFunction);
        }