예제 #1
0
        private void Refire(ScheduleToken schedule)
        {
            //获取当前的任务标记
            var token = _token;

            //如果当前任务标记为空(表示还没有启动排程)或任务标记已经被取消过(表示任务处于暂停或停止状态)
            if (token == null || token.IsCancellationRequested)
            {
                return;
            }

            //获取下次触发的时间点
            var timestamp = schedule.Trigger.GetNextOccurrence();

            //如果下次触发时间不为空(即需要触发)
            if (timestamp.HasValue)
            {
                if (timestamp < token.Timestamp)                      //如果新得到的触发时间小于待触发的时间,则尝试调度新的时间点
                {
                    this.Fire(timestamp.Value, new[] { schedule });
                }
                else if (timestamp == token.Timestamp)                //如果新得到的触发时间等于待触发的时间,则尝试将其加入到待触发任务中
                {
                    token.Append(schedule, (id, count, triggers) =>
                    {
                        //激发“Scheduled”事件
                        this.OnScheduled(id, count, triggers);
                    });
                }
            }
        }
예제 #2
0
            public bool Append(ScheduleToken token, Action <string, int, ITrigger[]> succeed)
            {
                var schedules = _schedules;

                if (schedules == null)
                {
                    return(false);
                }

                var result = false;
                var count  = 0;

                ITrigger[] triggers = null;

                lock (schedules)
                {
                    //将指定的调度项加入
                    result = schedules.Add(token);

                    //如果追加成功,则必须在同步临界区内进行统计
                    if (result && succeed != null)
                    {
                        //计算调度任务中的处理器总数
                        count = schedules.Sum(p => p.Count);

                        //获取调度任务中的触发器集合
                        triggers = schedules.Select(p => p.Trigger).ToArray();
                    }
                }

                //如果增加成功并且回调方法不为空,则回调成功方法
                if (result && succeed != null)
                {
                    succeed(this.Identity, count, triggers);
                }

                return(result);
            }