<PackageReference Include="NUnit" Version="3.4.0" />

EventQueue

public class EventQueue
Implements a queue of work items each of which is queued as a WaitCallback.
using System.Collections.Concurrent; using System.Threading; namespace NUnit.Framework.Internal.Execution { public class EventQueue { private const int spinCount = 5; private readonly ConcurrentQueue<Event> _queue = new ConcurrentQueue<Event>(); private readonly ManualResetEventSlim _mreAdd = new ManualResetEventSlim(false); private int _addId = -2147483648; private int _removeId = -2147483648; private int _stopped; public int Count => _queue.Count; public void Enqueue(Event e) { int addId; do { addId = _addId; } while (Interlocked.CompareExchange(ref _addId, addId + 1, addId) != addId); _queue.Enqueue(e); _mreAdd.Set(); Thread.Sleep(1); } public Event Dequeue(bool blockWhenEmpty) { SpinWait spinWait = default(SpinWait); while (true) { int removeId = _removeId; int addId = _addId; if (removeId == addId) { if (!blockWhenEmpty || _stopped != 0) return null; if (spinWait.Count <= 5) spinWait.SpinOnce(); else { _mreAdd.Reset(); if (removeId != _removeId || addId != _addId) _mreAdd.Set(); else _mreAdd.Wait(500); } } else if (Interlocked.CompareExchange(ref _removeId, removeId + 1, removeId) == removeId) { break; } } Event result; while (!_queue.TryDequeue(out result)) { if (!blockWhenEmpty || _stopped != 0) return null; } return result; } public void Stop() { if (Interlocked.CompareExchange(ref _stopped, 1, 0) == 0) _mreAdd.Set(); } } }