using System;
using System.Threading;
namespace ZeroLevel.Services.Shedulling
{
///
/// Обертка над Action, хранящее время в которое должно быть выполнено действие,
/// а также ссылку на следующее действие
///
internal class ExpiredObject
{
private static long _counter = 0;
public ExpiredObject()
{
Key = Interlocked.Increment(ref _counter);
if(Key == -1)
Key = Interlocked.Increment(ref _counter);
}
public ExpiredObject(bool has_no_key)
{
if (has_no_key)
Key = -1;
else
Key = Interlocked.Increment(ref _counter);
}
public ExpiredObject Reset(DateTime nextDate)
{
ExpirationDate = nextDate;
Next = null;
return this;
}
///
/// Событие при завершении ожидания
///
public Action Callback;
///
/// Срок истечения ожидания
///
public DateTime ExpirationDate;
///
/// Следующий объект с ближайшей датой окончания ожидания
///
public ExpiredObject Next;
///
/// Ключ для идентификации ожидающего события
///
public long Key { get; }
}
}