Files
ADP/UIShare/GlobalVariable/ScopeLogDispatcher.cs
2026-06-25 17:00:17 +08:00

49 lines
1.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Logger;
using System;
using System.Collections.Concurrent;
using System.Windows.Media;
namespace UIShare.GlobalVariable
{
/// <summary>
/// 作用域日志分发器:根据显式传入的 scope 参数把日志路由到对应
/// <see cref="ScopedContext.LogBuffer"/>,实现每个台架/作用域拥有独立 LogArea。
/// 直接写入 ConcurrentQueue不走 Progress&lt;T&gt; / SynchronizationContext避免 UI 线程压力。
/// </summary>
public class ScopeLogDispatcher : IProgress<(string scope, string message, string color, int depth)>
{
private readonly GlobalInfo _globalInfo;
/// <summary>Brush 缓存,避免每次都 new BrushConverter</summary>
private static readonly ConcurrentDictionary<string, Brush> _brushCache = new();
public ScopeLogDispatcher(GlobalInfo globalInfo)
{
_globalInfo = globalInfo ?? throw new ArgumentNullException(nameof(globalInfo));
}
public void Report((string scope, string message, string color, int depth) value)
{
var scope = value.scope;
if (string.IsNullOrEmpty(scope)) return;
if (!_globalInfo.ContextDic.TryGetValue(scope, out var context)) return;
Brush brush = _brushCache.GetOrAdd(value.color, color =>
{
try
{
return (Brush)new BrushConverter().ConvertFromString(color);
}
catch
{
return Brushes.Black;
}
});
// 直接入队到后台线程安全的 ConcurrentQueue不走 SynchronizationContext
context.LogBuffer.Enqueue((value.message, brush, value.depth));
}
}
}