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; }
}
}