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); }); } } }
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); }