Exemple #1
0
 /// <summary>
 /// Shuts down the scheduler.
 /// </summary>
 public void ShutDown()
 {
     lock (_syncObject)
     {
         InternalPauseAll();
         _status = TaskSchedulerStatus.Shutdown;
     }
 }
 /// <summary>
 /// シャットダウン開始。
 /// シャットダウンを始めると、新規タスクの追加ができなくなる。
 /// 現在実行中のタスクが全部終了するか、タイムアウトしたらcallbackが呼ばれる。
 /// </summary>
 /// <param name="callback"></param>
 public void Shutdown(Action <TaskSchedulerStatus> callback)
 {
     if (_status == TaskSchedulerStatus.Running)
     {
         _status = TaskSchedulerStatus.Shutdown;
         _shutdownBiginingTime = DateTime.Now;
         _shutdownCallback     = callback;
     }
     else
     {
         callback(_status);
     }
 }
        private void CheckShutdown()
        {
            if (_status == TaskSchedulerStatus.Shutdown)
            {
                // しばらく実行。タスクが1つもなくなったら完了
                if (!_runningTasks.Any() && (_suspendedTasks == null || !_suspendedTasks.Any()) && !_tcsTasks.Any())
                {
                    _status = TaskSchedulerStatus.ShutdownCompleted;
                    var d = _shutdownCallback;
                    if (d != null)
                    {
                        d(_status);
                    }

                    return;
                }

                // タイムアウトのチェック。タイムアウトしてたら強制終了。
                var now  = DateTime.Now;
                var span = now - _shutdownBiginingTime;

                if (span > ShutdownTimeout)
                {
                    _status = TaskSchedulerStatus.ShutdownTimeout;

                    foreach (var t in _runningTasks)
                    {
                        t.TryCancel();
                    }
                    if (_suspendedTasks != null)
                    {
                        foreach (var t in _suspendedTasks)
                        {
                            t.TryCancel();
                        }
                    }

                    var d = _shutdownCallback;
                    if (d != null)
                    {
                        d(_status);
                    }
                }
            }
        }
Exemple #4
0
 private void Init()
 {
     _tasks  = new OrderedDictionary();
     _status = TaskSchedulerStatus.Started;
 }