Skip to content

Instantly share code, notes, and snippets.

@i3arnon
Created October 6, 2015 20:59
Show Gist options
  • Save i3arnon/78a4da95601435d3d7db to your computer and use it in GitHub Desktop.
Save i3arnon/78a4da95601435d3d7db to your computer and use it in GitHub Desktop.
CollectiveTimer reduces timer allocations.
public class CollectiveTimer<T>
{
private readonly ConcurrentQueue<QueueItem> _queue;
public CollectiveTimer(Action<T> action, TimeSpan timeout, CancellationToken cancellationToken)
{
_queue = new ConcurrentQueue<QueueItem>();
Task.Run(async () =>
{
while (!cancellationToken.IsCancellationRequested)
{
QueueItem queueItem;
var now = DateTime.UtcNow;
while (_queue.TryPeek(out queueItem) && now - queueItem.Time >= timeout)
{
_queue.TryDequeue(out queueItem);
action(queueItem.Item);
}
await Task.Delay(TimeSpan.FromMilliseconds(50));
}
});
}
public void Enqueue(T item)
{
_queue.Enqueue(new QueueItem(item, DateTime.UtcNow));
}
private sealed class QueueItem
{
public T Item { get; private set; }
public DateTime Time { get; private set; }
public QueueItem(T item, DateTime time)
{
Item = item;
Time = time;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment