#if NET20 || NET35 using System.Collections; using System.Collections.Generic; namespace MPF.Frontend { internal interface IReadOnlyCollection : IEnumerable { int Count { get; } } internal sealed class ConcurrentQueue : IReadOnlyCollection { private Queue _queue = new Queue(); 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 IEnumerable.GetEnumerator() => _queue.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _queue.GetEnumerator(); } } #endif