/// <summary> /// Blocks execution of current thread until this daemon has completely stopped. /// This call must be performed by only 1 thread otherwise exception is thrown /// </summary> public void WaitForCompleteStop() { lock (m_StatusLock) { if (m_Status == DaemonStatus.Inactive) { return; } if (m_Status != DaemonStatus.Stopping) { SignalStop(); } if (m_PendingWaitingStop) { throw new AzosException(StringConsts.DAEMON_INVALID_STATE + "{0}.{1}".Args(Name, "WaitForCompleteStop() already blocked")); } m_PendingWaitingStop = true; try { DoWaitForCompleteStop(); } finally { m_PendingWaitingStop = false; } m_Status = DaemonStatus.Inactive; } }
/// <summary> /// 停止任务管理器 /// </summary> public void Stop() { Status = DaemonStatus.Stop; _timer.Stop(); //foreach (CronJob job in cron_jobs) // job.abort(); }
/// <summary> /// Non-blocking call that initiates the stopping of the daemon /// </summary> public void SignalStop() { lock (m_StatusLock) if (m_Status == DaemonStatus.Active) { m_Status = DaemonStatus.Stopping; DoSignalStop(); } }
/// <summary> /// 停止任务管理器 /// </summary> public void Stop() { Status = DaemonStatus.Stop; _timer.Stop(); foreach (CronJob job in _cronJobs) { job.abort(); } }
/// <summary> /// Allows to abort unsuccessful DoStart() overridden implementation. /// This method must be called from within DoStart() /// </summary> protected void AbortStart() { var trace = new StackTrace(1, false); if (!trace.GetFrames().Any(f => f.GetMethod().Name.Equals("DoStart", StringComparison.Ordinal))) { Debugging.Fail( text: "Daemon.AbortStart() must be called from within DoStart()", action: DebugAction.ThrowAndLog); } m_Status = DaemonStatus.AbortingStart; }
/// <summary> /// Blocking call that starts the daemon instance /// </summary> public void Start() { EnsureObjectNotDisposed(); lock (m_StatusLock) if (m_Status == DaemonStatus.Inactive) { m_Status = DaemonStatus.Starting; try { Behavior.ApplyBehaviorAttributes(this); DoStart(); m_Status = DaemonStatus.Active; } catch { m_Status = DaemonStatus.Inactive; throw; } } }
/// <summary> /// 启动任务管理器 /// </summary> public void Start() { #region 确保执行时间是 每秒的中间时刻执行 int millisecond = DateTime.Now.Millisecond; if (millisecond > 500) { millisecond = 1500 - millisecond; } else if (millisecond < 500) { millisecond = 500 - millisecond; } if (millisecond != 500) { Task.Delay(millisecond).Wait(); } #endregion _timer.Start(); Status = DaemonStatus.Started; }