Files
serein-flow/WorkBench/tool/LogTextWriter.cs

93 lines
2.5 KiB
C#
Raw Normal View History

using System.Collections.Concurrent;
using System.IO;
2024-08-05 10:11:58 +08:00
using System.Text;
namespace Serein.WorkBench.tool
{
/// <summary>
/// 可以捕获类库输出的打印输出
/// </summary>
public class LogTextWriter : TextWriter
2024-08-05 10:11:58 +08:00
{
private readonly Action<string> logAction;
2024-08-05 10:11:58 +08:00
private readonly StringWriter stringWriter = new();
private readonly BlockingCollection<string> logQueue = new();
private readonly Task logTask;
// 用于计数的字段
private int writeCount = 0;
private const int maxWrites = 500;
private readonly Action clearTextBoxAction;
public LogTextWriter(Action<string> logAction, Action clearTextBoxAction)
{
this.logAction = logAction;
this.clearTextBoxAction = clearTextBoxAction;
logTask = Task.Run(ProcessLogQueue); // 异步处理日志
}
2024-08-05 10:11:58 +08:00
public override Encoding Encoding => Encoding.UTF8;
public override void Write(char value)
{
stringWriter.Write(value);
if (value == '\n')
{
EnqueueLog();
2024-08-05 10:11:58 +08:00
}
}
public override void Write(string? value)
{
if (string.IsNullOrWhiteSpace(value)) return;
2024-08-05 10:11:58 +08:00
stringWriter.Write(value);
if (value.Contains('\n'))
{
EnqueueLog();
2024-08-05 10:11:58 +08:00
}
}
public override void WriteLine(string? value)
{
if (string.IsNullOrWhiteSpace(value)) return;
2024-08-05 10:11:58 +08:00
stringWriter.WriteLine(value);
EnqueueLog();
}
private void EnqueueLog()
{
logQueue.Add(stringWriter.ToString());
2024-08-05 10:11:58 +08:00
stringWriter.GetStringBuilder().Clear();
}
private async Task ProcessLogQueue()
{
foreach (var log in logQueue.GetConsumingEnumerable())
{
// 异步执行日志输出操作
await Task.Run(() =>
{
logAction(log);
// 计数器增加
writeCount++;
if (writeCount >= maxWrites)
{
// 计数器达到50清空文本框
clearTextBoxAction?.Invoke();
writeCount = 0; // 重置计数器
}
});
}
}
public new void Dispose()
{
logQueue.CompleteAdding();
logTask.Wait();
base.Dispose();
}
2024-08-05 10:11:58 +08:00
}
2024-08-05 10:11:58 +08:00
}