using System.Threading.Channels; using SatelliteProvider.Common.DTO; using SatelliteProvider.Common.Interfaces; namespace SatelliteProvider.Services; public class RegionRequestQueue : IRegionRequestQueue { private readonly Channel _queue; public RegionRequestQueue(int capacity) { var options = new BoundedChannelOptions(capacity) { FullMode = BoundedChannelFullMode.Wait }; _queue = Channel.CreateBounded(options); } public async ValueTask EnqueueAsync(RegionRequest request, CancellationToken cancellationToken = default) { await _queue.Writer.WriteAsync(request, cancellationToken); } public async ValueTask DequeueAsync(CancellationToken cancellationToken = default) { if (await _queue.Reader.WaitToReadAsync(cancellationToken)) { if (_queue.Reader.TryRead(out var request)) { return request; } } return null; } public int Count => _queue.Reader.Count; }