namespace FileSearch.Logic.Model.Engine { internal class TimedCallback { private readonly TimeSpan _timeout; private readonly Action> _callback; private DateTime _lastTrigger; private bool _isRunning = false; public TimedCallback(TimeSpan timeout, Action> callback) { if (callback == null) throw new ArgumentNullException("callback"); if (timeout.TotalSeconds < 0.1) throw new ArgumentException(@"The timeout should be minimal 0.1 second.", "timeout"); _timeout = timeout; _callback = callback; _lastTrigger = DateTime.UtcNow; } /// /// Значение, указывающее, превышен ли период тайм-аута и можно ли получить новые данные. /// public bool DataNeeded { get { return !_isRunning && DateTime.UtcNow - _lastTrigger >= _timeout; } } /// /// Устанавливает данные для отправки делегату обратного вызова. /// /// Сбор с данными. public void SetData(IEnumerable collection) { try { _isRunning = true; _callback(collection); _lastTrigger = DateTime.UtcNow; } finally { _isRunning = false; } } } }