Unify queue handling in processing queue

This commit is contained in:
Matt Nadareski
2024-12-05 21:40:53 -05:00
parent 0c327872b5
commit ebb83a6a1e
3 changed files with 47 additions and 12 deletions

View File

@@ -47,6 +47,7 @@
- Ensure dumping commands are tested
- Add tests around default values
- Increase sleep time in queue
- Unify queue handling in processing queue
### 3.2.4 (2024-11-24)

45
MPF.Frontend/OldDotNet.cs Normal file
View File

@@ -0,0 +1,45 @@
#if NET20 || NET35
using System.Collections;
using System.Collections.Generic;
namespace MPF.Frontend
{
internal interface IReadOnlyCollection<T> : IEnumerable<T>
{
int Count { get; }
}
internal sealed class ConcurrentQueue<T> : IReadOnlyCollection<T>
{
private Queue<T> _queue = new Queue<T>();
private object _lock = new object();
public int Count => _queue.Count;
public void Enqueue(T item)
{
lock (_lock)
{
_queue.Enqueue(item);
}
}
public bool TryDequeue(out T item)
{
lock (_lock)
{
item = default(T)!;
if (_queue.Count == 0)
return false;
item = _queue.Dequeue();
return true;
}
}
IEnumerator<T> IEnumerable<T>.GetEnumerator() => _queue.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => _queue.GetEnumerator();
}
}
#endif

View File

@@ -1,7 +1,5 @@
using System;
#if NET20 || NET35
using System.Collections.Generic;
#else
#if NET40_OR_GREATER || NETCOREAPP
using System.Collections.Concurrent;
#endif
using System.Threading;
@@ -14,11 +12,7 @@ namespace MPF.Frontend
/// <summary>
/// Internal queue to hold data to process
/// </summary>
#if NET20 || NET35
private readonly Queue<T> _internalQueue;
#else
private readonly ConcurrentQueue<T> _internalQueue;
#endif
/// <summary>
/// Custom processing step for dequeued data
@@ -77,17 +71,12 @@ namespace MPF.Frontend
continue;
}
#if NET20 || NET35
// Get the next item from the queue and invoke the lambda, if possible
_customProcessing?.Invoke(_internalQueue.Dequeue());
#else
// Get the next item from the queue
if (!_internalQueue.TryDequeue(out var nextItem))
continue;
// Invoke the lambda, if possible
_customProcessing?.Invoke(nextItem);
#endif
}
}
}