Dispenser/DispenserUI/ViewModels/Components/ConsoleLogVM.cs

61 lines
1.5 KiB
C#

using System.Collections.Concurrent;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using Avalonia.Threading;
using DispenserCommon.Aop;
using DispenserCommon.DTO;
using DispenserCommon.Events;
using DispenserCommon.Ioc;
using ReactiveUI;
namespace DispenserUI.ViewModels.Components;
/// <summary>
/// 控制台日志
/// </summary>
[Component, GlobalTry]
public class ConsoleLogVM : ViewModelBase
{
// 实现的最大行数
private const int MaxLines = 200;
private ObservableCollection<LogMessage> _logs = [];
public ObservableCollection<LogMessage> Logs
{
get => _logs;
set => this.RaiseAndSetIfChanged(ref _logs, value);
}
private readonly BlockingCollection<LogMessage> _buffer = new(100);
/// <summary>
/// 监听控制台日志
/// </summary>
/// <param name="type"></param>
/// <param name="log"></param>
[EventAction(EventType.RollingLog)]
public void Listening(EventType type, LogMessage log)
{
_buffer.TryAdd(log);
}
/// <summary>
/// 将日志渲染到界面
/// </summary>
public void RenderLog()
{
Task.Run(() =>
{
foreach (var log in _buffer.GetConsumingEnumerable())
{
Dispatcher.UIThread.InvokeAsync(() =>
{
if (Logs.Count >= MaxLines) Logs.RemoveAt(0);
Logs.Add(log);
});
Task.Delay(100).Wait();
}
});
}
}