/// <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); } } } }
private void Init() { _tasks = new OrderedDictionary(); _status = TaskSchedulerStatus.Started; }