using System.Collections.Concurrent; namespace BMA.EHR.Insignia.Service.Services { public class BackgroundTaskQueue : IBackgroundTaskQueue { private readonly ConcurrentQueue> _workItems = new(); private readonly SemaphoreSlim _signal = new(0); public ValueTask QueueBackgroundWorkItemAsync(Func workItem) { if (workItem == null) throw new ArgumentNullException(nameof(workItem)); _workItems.Enqueue(workItem); _signal.Release(); return ValueTask.CompletedTask; } public async ValueTask> DequeueAsync(CancellationToken cancellationToken) { await _signal.WaitAsync(cancellationToken); _workItems.TryDequeue(out var workItem); return workItem!; } } }