public static ScheduledTaskStatus RegisterTask(ScheduledTask Task, TriggerBuilder TaskBuilder) { var sessionId = Guid.NewGuid().ToString("D"); var triggerKey = GenerateTriggerKey(); var taskType = Task.GetType(); var taskStatus = new ScheduledTaskStatus(Task, sessionId, triggerKey.Name); lock (_RunningTasksLock) { if (Task.SingleInstanceTask) { var existingGuid = _RunningTasks.Where(t => t.IsRunning && t.TaskType == taskType).Select(t => t.SessionId).FirstOrDefault(); if (existingGuid != null) throw new InvalidOperationException(string.Format("This Single-Instance Task is already running, SessionId: {0}", existingGuid)); } _RunningTasks.Add(taskStatus); } if (TaskBuilder != null) { ITrigger trigger = TaskBuilder.WithIdentity(triggerKey).Build(); IJobDetail jobDetails = new JobDetailImpl(sessionId, taskType) { Description = Task.TaskName, JobDataMap = trigger.JobDataMap }; _TaskScheduler.ScheduleJob(jobDetails, trigger); var nextTriggerTime = trigger.GetNextFireTimeUtc(); if (nextTriggerTime.HasValue) taskStatus.SetNextScheduledTimestamp(nextTriggerTime.Value.LocalDateTime); } return taskStatus; }
public ScheduledTaskStatus(ScheduledTask Task, string SessionId, string TriggerKey, string FinishedUrl = null) { this._taskName = Task.TaskName; this._taskType = Task.GetType(); this._tcs = new TaskCompletionSource<ScheduledTaskStatus>(); this._sessionId = SessionId; this._triggerKey = TriggerKey; this._cancelInitiallySupported = Task.CancelInitiallySupported; this._cancelSupported = this._cancelInitiallySupported; this._finishedUrl = FinishedUrl; this._currentProcess = "Scheduled"; this._currentDescription = "Scheduled Task for Execution"; this.ProgressMultiplier = 1; this._progress = 0; }