using System; using System.Collections.Concurrent; using System.Linq; using System.Reflection; using ZeroLevel.Logging; using ZeroLevel.Services.Invokation; using ZeroLevel.Services.Serialization; namespace TestApp { public record LogMessage(LogLevel Level, T Message); internal interface ILogMessageBuffer : IDisposable { long Count(); void Push(LogLevel level, T message); LogMessage Take(); } internal sealed class NoLimitedLogMessageBuffer : ILogMessageBuffer { private readonly BlockingCollection> _messageQueue = new BlockingCollection>(); private bool _isDisposed = false; public long Count() { if (_messageQueue.IsCompleted) return 0; return _messageQueue.Count; } public void Dispose() { if (!_isDisposed) { _isDisposed = true; _messageQueue.Dispose(); } } public void Push(LogLevel level, T message) { if (_isDisposed) return; _messageQueue.Add(new LogMessage(level, message)); } public LogMessage Take() { return _messageQueue.Take(); } } internal static class Program { private static void Main(string[] args) { } } }