Je vyžadována podpora jazyka JavaScript
Některé stránky na tomto webu vyžadují podporu jazyka JavaScript. Váš webový prohlížeč jazyk JavaScript nepodporuje nebo jazyk JavaScript není povolen.
Chcete-li zjistit, zda webový prohlížeč podporuje jazyk JavaScript nebo jazyk JavaScript chcete povolit, přečtěte si nápovědu k vašemu webovému prohlížeči.
Scheduler.cs
Download fileToto je zdrojový kód souboru Scheduler.cs
Class for triggering recurring Tasks.
using System; namespace IMP.Shared { internal sealed class Scheduler : IDisposable { #region delegate and events /// <summary> /// Událost pro spuštění úlohy /// </summary> public event EventHandler RunTask; #endregion #region member varible and default property initialization private System.Timers.Timer SchedulerTimer; private TimeSpan m_StartTime; private TimeSpan m_StartDelay; private TimeSpan m_Interval; private bool m_RunOnStart; private bool m_Enabled; /// <summary> /// Plánovaný čas dalšího spuštění úlohy nebo čas, kdy byla spuštěna aktuálně běžící úloha. Pokud scheduler neběží, vrací vlastnost hodnotu <c>null</c>. /// </summary> /// <remarks> /// Vlastnost je změněna při naplánování prvního spuštění a pak vždy po dokončení úlohy. /// </remarks> public DateTime? NextRunTime { get; private set; } #endregion #region constructors and destructors /// <summary> /// Konstruktor instance třídy Scheduler /// </summary> public Scheduler() { this.SchedulerTimer = new System.Timers.Timer(); this.SchedulerTimer.Elapsed += new System.Timers.ElapsedEventHandler(SchedulerTimer_Elapsed); this.SchedulerTimer.AutoReset = false; m_Interval = TimeSpan.FromDays(1); } #endregion #region action methods /// <summary> /// Spuštění scheduleru a naplánování prvního spuštění úlohy dle nastavení <see cref="StartTime"/>, <see cref="StartDelay"/> a <see cref="RunOnStart"/> /// </summary> public void Start() { this.Enabled = true; } /// <summary> /// Zastavení scheduleru /// </summary> public void Stop() { this.Enabled = false; } /// <summary> /// Uvolnění prostředků používaných aktuálním objektem /// </summary> public void Dispose() { Stop(); this.SchedulerTimer.Dispose(); } #endregion #region property getters/setters /// <summary> /// Posun času spouštění úlohy od 0:00:00, musí být menší než Interval /// </summary> public TimeSpan StartTime { get { return m_StartTime; } set { if (value < TimeSpan.Zero) { throw new ArgumentOutOfRangeException("value", "Invalid StartTime value."); } if (this.Enabled) { throw new InvalidOperationException("Scheduler is already running."); } m_StartTime = value; } } /// <summary> /// Minimální doba po volání metody <see cref="Start"/>, po které může být provedeno první spuštění úlohy /// </summary> public TimeSpan StartDelay { get { return m_StartDelay; } set { if (value < TimeSpan.Zero) { throw new ArgumentOutOfRangeException("value", "Invalid StartDelay value."); } if (this.Enabled) { throw new InvalidOperationException("Scheduler is already running."); } m_StartDelay = value; } } /// <summary> /// Interval opakovaného spouštění úlohy /// </summary> public TimeSpan Interval { get { return m_Interval; } set { if (value <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException("value", "Invalid Interval value."); } if (this.Enabled) { throw new InvalidOperationException("Scheduler is already running."); } m_Interval = value; } } /// <summary> /// <c>true</c> pro provedení prvního spuštění úlohy ihned po uplynutí <see cref="StartDelay"/> od okamžiku zavolání metody <see cref="Start"/> /// </summary> public bool RunOnStart { get { return m_RunOnStart; } set { if (this.Enabled) { throw new InvalidOperationException("Scheduler is already running."); } m_RunOnStart = value; } } /// <summary> /// Vrací, zda scheduler běží /// </summary> public bool Enabled { get { return m_Enabled; } set { if (m_Enabled != value) { if (value) { if (m_StartTime >= m_Interval) { throw new InvalidOperationException("StartTime must be smaller than Interval."); } //První spuštění v první násobek intervalu s posunem StartTime this.NextRunTime = DateTime.Today.Add(m_StartTime); Schedule(m_StartDelay); if (m_RunOnStart) { this.SchedulerTimer.Interval = Math.Max(m_StartDelay.TotalMilliseconds, 50); } this.SchedulerTimer.Start(); } else { this.SchedulerTimer.Stop(); this.NextRunTime = null; } m_Enabled = value; } } } #endregion #region private member functions private void Schedule(TimeSpan delay = default(TimeSpan)) { DateTime now = DateTime.Now; long ticks = (now - this.NextRunTime.Value).Ticks; if (ticks >= 0) { this.NextRunTime = this.NextRunTime.Value.Add(TimeSpan.FromTicks(((ticks / m_Interval.Ticks) + 1) * m_Interval.Ticks)); } TimeSpan dueTime = (this.NextRunTime.Value - now); if (dueTime < delay) { dueTime = delay; } this.SchedulerTimer.Interval = Math.Max(dueTime.TotalMilliseconds, 50); } private void SchedulerTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { try { var handler = RunTask; if (handler != null) { handler(sender, EventArgs.Empty); } } finally { if (m_Enabled) { //Naplánování dalšího spuštění Schedule(); this.SchedulerTimer.Start(); } } } #endregion } }