Update
This commit is contained in:
@@ -1,60 +1,49 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using ConsoleApp2.Entities;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace ConsoleApp2.Services;
|
||||
|
||||
public class DataRecordQueue
|
||||
public class DataRecordQueue : IDisposable
|
||||
{
|
||||
/// <summary>
|
||||
/// Indicate that the queue is completed adding.
|
||||
/// </summary>
|
||||
public bool IsCompletedAdding { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Remark that the queue is completed for adding and empty;
|
||||
/// </summary>
|
||||
public bool IsCompleted => IsCompletedAdding && _queue.IsEmpty;
|
||||
|
||||
private readonly ConcurrentQueue<DataRecord> _queue;
|
||||
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 ConcurrentQueue<DataRecord>();
|
||||
}
|
||||
|
||||
public DataRecordQueue(IEnumerable<DataRecord> records)
|
||||
{
|
||||
_queue = new ConcurrentQueue<DataRecord>(records);
|
||||
_queue = new BlockingCollection<DataRecord>();
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="ConcurrentQueue{T}.Enqueue"/>
|
||||
public void Enqueue(DataRecord item)
|
||||
public bool TryDequeue([MaybeNullWhen(false)] out DataRecord record)
|
||||
{
|
||||
_queue.Enqueue(item);
|
||||
if (_queue.TryTake(out record))
|
||||
{
|
||||
OnRecordRead?.Invoke();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="ConcurrentQueue{T}.TryDequeue"/>
|
||||
public bool TryDequeue([MaybeNullWhen(false)] out DataRecord result)
|
||||
public DataRecord Dequeue() => _queue.Take();
|
||||
|
||||
public void CompleteAdding() => _queue.CompleteAdding();
|
||||
|
||||
public void Enqueue(DataRecord record)
|
||||
{
|
||||
return _queue.TryDequeue(out result);
|
||||
_queue.Add(record);
|
||||
OnRecordWrite?.Invoke();
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="ConcurrentQueue{T}.TryPeek"/>
|
||||
public bool TryPeek([MaybeNullWhen(false)] out DataRecord result)
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
return _queue.TryPeek(out result);
|
||||
_queue.Dispose();
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="ConcurrentQueue{T}.Count"/>
|
||||
public int Count => _queue.Count;
|
||||
|
||||
/// <inheritdoc cref="ConcurrentQueue{T}.IsEmpty"/>
|
||||
public bool IsEmpty => _queue.IsEmpty;
|
||||
|
||||
/// <summary>
|
||||
/// Indicate that the queue is completed adding.
|
||||
/// </summary>
|
||||
public void CompleteAdding() => IsCompletedAdding = true;
|
||||
}
|
Reference in New Issue
Block a user