using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Threading; namespace PalGain.Core.Tasks { /// /// Represents task thread /// public partial class TaskThread : IDisposable { private Timer _timer; private bool _disposed; private readonly Dictionary _tasks; internal TaskThread() { this._tasks = new Dictionary(); this.Seconds = 10 * 60; } private void Run() { if (Seconds <= 0) return; this.StartedUtc = DateTime.UtcNow; this.IsRunning = true; foreach (Task task in this._tasks.Values) { task.Execute(); } this.IsRunning = false; } private void TimerHandler(object state) { this._timer.Change(-1, -1); this.Run(); if (this.RunOnlyOnce) { this.Dispose(); } else { this._timer.Change(this.Interval, this.Interval); } } /// /// Disposes the instance /// public void Dispose() { if ((this._timer != null) && !this._disposed) { lock (this) { this._timer.Dispose(); this._timer = null; this._disposed = true; } } } /// /// Inits a timer /// public void InitTimer() { if (this._timer == null) { this._timer = new Timer(new TimerCallback(this.TimerHandler), null, this.Interval, this.Interval); } //this.Run(); } /// /// Adds a task to the thread /// /// The task to be added public void AddTask(Task task) { if (!this._tasks.ContainsKey(task.Name)) { this._tasks.Add(task.Name, task); } } /// /// Gets or sets the interval in seconds at which to run the tasks /// public int Seconds { get; set; } /// /// Get or sets a datetime when thread has been started /// public DateTime StartedUtc { get; private set; } /// /// Get or sets a value indicating whether thread is running /// public bool IsRunning { get; private set; } /// /// Get a list of tasks /// public IList Tasks { get { var list = new List(); foreach (var task in this._tasks.Values) { list.Add(task); } return new ReadOnlyCollection(list); } } /// /// Gets the interval at which to run the tasks /// public int Interval { get { return this.Seconds * 1000; } } /// /// Gets or sets a value indicating whether the thread whould be run only once (per appliction start) /// public bool RunOnlyOnce { get; set; } } }