/// <summary> /// Initialize Requirement /// Set timer /// </summary> /// <param name="addNewSchedule">Specify add new Schedule</param> private void Initialize(bool addNewSchedule) { if (addNewSchedule) { // Set Identity _scheduleItem = new G9DtScheduleItem { Identity = ScheduleIdentity = Guid.NewGuid() }; lock (LockCollectionForScheduleTask) { // Add schedule _saveScheduleTask.Add(ScheduleIdentity, _scheduleItem); } } // If use cancellation token - initialize again if (_cancellationToken.IsCancellationRequested) { InitializeCancellationTokens(); } // if not active return if (_activeSchedule) { return; } _activeSchedule = true; Task.Factory.StartNew(async() => { while (!_cancellationToken.IsCancellationRequested) { // Check Schedule handler method finished or no if (_waitForFinishScheduleHandler) { // if not finished Delay and check again await Task.Delay(1); } else { // if finished run Schedule handler again and wait try { await ScheduleHandler(); } catch { // Ignore } await Task.Delay(1); } } // ReSharper disable once FunctionNeverReturns }, _cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current); }
/// <summary> /// Constructor - Restore Schedule by identity /// Initialize Requirement /// </summary> /// <param name="scheduleIdentity">Specify Schedule identity for restore enable Schedule</param> public G9CSchedule(Guid scheduleIdentity) { lock (LockCollectionForScheduleTask) { if (!_saveScheduleTask.ContainsKey(scheduleIdentity)) { throw new Exception("Schedule not found!"); } _scheduleItem = _saveScheduleTask[scheduleIdentity]; } ScheduleIdentity = scheduleIdentity; Initialize(false); }
/// <summary> /// Dispose this Schedule /// </summary> public void Dispose() { lock (LockCollectionForScheduleTask) { if (_saveScheduleTask[ScheduleIdentity].DisposeCallBack == null) { _saveScheduleTask[ScheduleIdentity].DisposeCallBack = new HashSet <Action>(); } foreach (var action in _saveScheduleTask[ScheduleIdentity].DisposeCallBack) { action?.Invoke(); } _saveScheduleTask.Remove(ScheduleIdentity); } ScheduleIdentity = Guid.Empty; _scheduleItem = null; // Dispose schedule system if not exist any task if (!_saveScheduleTask.Any()) { _cancellationTokenSource.Cancel(); } }