Files
MPF/MPF.Library/Data/ProcessingQueue.cs

69 lines
1.8 KiB
C#
Raw Normal View History

2021-03-29 10:23:34 -07:00
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
2021-03-29 11:55:29 -07:00
namespace MPF.Data
2021-03-29 10:23:34 -07:00
{
2021-03-29 10:50:43 -07:00
public class ProcessingQueue<T> : IDisposable
2021-03-29 10:23:34 -07:00
{
/// <summary>
/// Internal queue to hold data to process
/// </summary>
private readonly ConcurrentQueue<T> InternalQueue;
/// <summary>
/// Custom processing step for dequeued data
/// </summary>
private readonly Action<T> CustomProcessing;
2021-03-29 10:50:43 -07:00
/// <summary>
/// Internal processing task for dequeueing
/// </summary>
private readonly Task ProcessingTask;
2021-03-29 10:23:34 -07:00
public ProcessingQueue(Action<T> customProcessing)
{
this.InternalQueue = new ConcurrentQueue<T>();
this.CustomProcessing = customProcessing;
2021-03-29 10:50:43 -07:00
this.ProcessingTask = Task.Run(() => ProcessQueue());
}
/// <summary>
/// Dispose the current instance
/// </summary>
public void Dispose()
{
this.ProcessingTask.Dispose();
}
/// <summary>
/// Enqueue a new item for processing
/// </summary>
/// <param name="item"></param>
public void Enqueue(T item)
{
this.InternalQueue.Enqueue(item);
2021-03-29 10:23:34 -07:00
}
/// <summary>
/// Process
/// </summary>
private void ProcessQueue()
{
while (true)
{
// Nothing in the queue means we get to idle
if (InternalQueue.Count == 0)
continue;
// Get the next item from the queue
if (!InternalQueue.TryDequeue(out T nextItem))
continue;
// Invoke the lambda, if possible
this.CustomProcessing?.Invoke(nextItem);
}
}
}
}