51 lines
1.1 KiB
C#
51 lines
1.1 KiB
C#
using System.Collections.Concurrent;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
|
namespace ConsoleApp2.Services;
|
|
|
|
/// <summary>
|
|
/// 数据队列
|
|
/// </summary>
|
|
public class DataRecordQueue : IDisposable
|
|
{
|
|
private readonly BlockingCollection<DataRecord> _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()
|
|
{
|
|
_queue = new BlockingCollection<DataRecord>(2000_000); // 队列最长为20W条记录
|
|
}
|
|
|
|
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();
|
|
}
|
|
} |