예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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();
            }
        }