61 lines
1.5 KiB
C#
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();
|
|
}
|
|
});
|
|
}
|
|
} |