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