private void CheckExpire(TaskTimer timer) { // get the next scheduled item UpdateRecord data = null; lock (_data) { if (_queue.Count == 0) { _queueTimer.Change(_delay, TaskEnv.Current); return; } Tuplet <string, DateTime> key = _queue.Peek(); if (key.Item2 > DateTime.UtcNow) { _queueTimer.Change(key.Item2, TaskEnv.Current); return; } data = _data[key.Item1]; _queue.Dequeue(); _data.Remove(key.Item1); } _dispatcher.Dispatch(data); // check for optimal sleep interval lock (_data) { if (_queue.Count == 0) { _queueTimer.Change(_delay, TaskEnv.Current); return; } Tuplet <string, DateTime> key = _queue.Peek(); _queueTimer.Change(key.Item2, TaskEnv.Current); } }
private void CheckExpire(TaskTimer timer) { while (true) { // get the next scheduled item UpdateRecord data = null; lock (_data) { if (_queue.Count == 0) { _queueTimer.Change(_delay, TaskEnv.None); return; } Tuplet <DateTime, XUri> key = _queue.Peek(); if (key.Item1 > DateTime.UtcNow) { _queueTimer.Change(key.Item1, TaskEnv.None); return; } data = _data[key.Item2]; _queue.Dequeue(); _data.Remove(key.Item2); } Interlocked.Increment(ref _pendingCount); _dispatcher.Dispatch(data, new Result(TimeSpan.MaxValue)).WhenDone(r => { // cleanup items from the queue var poll = false; foreach (var itemId in data.QueueIds) { if (!_persistentQueue.CommitDequeue(itemId)) { // if we couldn't take an item, it must have gone back to the queue, so we better poll again poll = true; } } if (poll) { _poll = true; } Interlocked.Decrement(ref _pendingCount); if (r.HasException) { _log.Error(string.Format("dispatch of '{0}' encountered an error", data.Id), r.Exception); } }); } }