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();
}
}