2024-09-20 10:50:32 +08:00
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
|
using System.IO;
|
2024-08-05 10:11:58 +08:00
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Serein.WorkBench.tool
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 可以捕获类库输出的打印输出
|
|
|
|
|
|
/// </summary>
|
2024-09-20 10:50:32 +08:00
|
|
|
|
public class LogTextWriter : TextWriter
|
2024-08-05 10:11:58 +08:00
|
|
|
|
{
|
2024-09-20 10:50:32 +08:00
|
|
|
|
private readonly Action<string> logAction;
|
2024-08-05 10:11:58 +08:00
|
|
|
|
private readonly StringWriter stringWriter = new();
|
2024-09-20 10:50:32 +08:00
|
|
|
|
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')
|
|
|
|
|
|
{
|
2024-09-20 10:50:32 +08:00
|
|
|
|
EnqueueLog();
|
2024-08-05 10:11:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void Write(string? value)
|
|
|
|
|
|
{
|
2024-09-20 10:50:32 +08:00
|
|
|
|
if (string.IsNullOrWhiteSpace(value)) return;
|
2024-08-05 10:11:58 +08:00
|
|
|
|
stringWriter.Write(value);
|
|
|
|
|
|
if (value.Contains('\n'))
|
|
|
|
|
|
{
|
2024-09-20 10:50:32 +08:00
|
|
|
|
EnqueueLog();
|
2024-08-05 10:11:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void WriteLine(string? value)
|
|
|
|
|
|
{
|
2024-09-20 10:50:32 +08:00
|
|
|
|
if (string.IsNullOrWhiteSpace(value)) return;
|
2024-08-05 10:11:58 +08:00
|
|
|
|
stringWriter.WriteLine(value);
|
2024-09-20 10:50:32 +08:00
|
|
|
|
EnqueueLog();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void EnqueueLog()
|
|
|
|
|
|
{
|
|
|
|
|
|
logQueue.Add(stringWriter.ToString());
|
2024-08-05 10:11:58 +08:00
|
|
|
|
stringWriter.GetStringBuilder().Clear();
|
|
|
|
|
|
}
|
2024-09-20 10:50:32 +08:00
|
|
|
|
|
|
|
|
|
|
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-09-20 10:50:32 +08:00
|
|
|
|
|
2024-08-05 10:11:58 +08:00
|
|
|
|
}
|