using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; namespace MesETL.App.Services; /// /// 数据队列 /// public class DataRecordQueue : IDisposable { private readonly BlockingCollection _queue; public int Count => _queue.Count; public bool IsCompleted => _queue.IsCompleted; public bool IsAddingCompleted => _queue.IsAddingCompleted; public event Action? OnRecordWrite; public event Action? OnRecordRead; public DataRecordQueue() : this(500_000) // 默认容量最大500K { } public DataRecordQueue(int boundedCapacity) { _queue = new BlockingCollection(boundedCapacity); } public bool TryDequeue([MaybeNullWhen(false)] out DataRecord record) { if (_queue.TryTake(out record)) { OnRecordRead?.Invoke(); return true; } return false; } public DataRecord Dequeue() => _queue.Take(); public void CompleteAdding() => _queue.CompleteAdding(); public void Enqueue(DataRecord record) { _queue.Add(record); OnRecordWrite?.Invoke(); } public void Dispose() { _queue.Dispose(); } }