mirror of
https://github.com/SabreTools/MPF.git
synced 2026-07-02 17:24:48 +00:00
Unify queue handling in processing queue
This commit is contained in:
@@ -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
45
MPF.Frontend/OldDotNet.cs
Normal 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
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user