diff --git a/Netch/Controllers/Interface/Instance.cs b/Netch/Controllers/Interface/Instance.cs
index 6a226952..8c049509 100644
--- a/Netch/Controllers/Interface/Instance.cs
+++ b/Netch/Controllers/Interface/Instance.cs
@@ -44,7 +44,7 @@ namespace Netch.Controllers
///
private string _logPath;
- private FileStream _logFileStream;
+ private readonly StringBuilder _logBuffer = new StringBuilder();
///
/// 程序输出的编码,
@@ -117,7 +117,6 @@ namespace Netch.Controllers
_logPath ??= Path.Combine(Global.NetchDir, $"logging\\{Name}.log");
if (File.Exists(_logPath))
File.Delete(_logPath);
- _logFileStream = new FileStream(_logPath, FileMode.Create, FileAccess.Write);
Instance.OutputDataReceived += OnOutputDataReceived;
Instance.ErrorDataReceived += OnOutputDataReceived;
@@ -133,8 +132,8 @@ namespace Netch.Controllers
// 启动日志重定向
Instance.BeginOutputReadLine();
Instance.BeginErrorReadLine();
- _writeStreamTimer.Elapsed += SaveStreamTimerEvent;
- _writeStreamTimer.Enabled = true;
+ SaveBufferTimer.Elapsed += SaveBufferTimerEvent;
+ SaveBufferTimer.Enabled = true;
// 等待启动
for (var i = 0; i < 1000; i++)
{
@@ -161,16 +160,13 @@ namespace Netch.Controllers
}
}
- private static System.Timers.Timer _writeStreamTimer = new System.Timers.Timer(300) {AutoReset = true};
+ private static readonly System.Timers.Timer SaveBufferTimer = new System.Timers.Timer(300) {AutoReset = true};
private void OnExited(object sender, EventArgs e)
{
if (RedirectStd)
{
- _writeStreamTimer.Enabled = false;
- Thread.Sleep(100); // 等待 Write() 写入流
- _logFileStream.Close();
- _logFileStream = null;
+ SaveBufferTimer.Enabled = false;
}
State = State.Stopped;
@@ -187,9 +183,9 @@ namespace Netch.Controllers
if (e.Data == null)
return;
- var info = Encoding.GetEncoding(InstanceOutputEncoding).GetBytes(e.Data + Global.EOF);
- Task.Run(() => Write(info));
+ var info = Encoding.GetEncoding(InstanceOutputEncoding).GetBytes(e.Data);
var str = Encoding.UTF8.GetString(info);
+ Write(str);
// 检查启动
if (State == State.Starting)
{
@@ -205,42 +201,27 @@ namespace Netch.Controllers
///
///
///
- private async void SaveStreamTimerEvent(object sender, EventArgs e)
+ private void SaveBufferTimerEvent(object sender, EventArgs e)
{
- if (_logFileStream == null) return;
try
{
- await _logFileStream.FlushAsync();
+ File.AppendAllText(_logPath, _logBuffer.ToString());
+ _logBuffer.Clear();
}
- catch
+ catch (Exception exception)
{
- // ignored
+ Logging.Warning($"写入 {Name} 日志错误:\n" + exception.Message);
}
}
- private readonly object _fileLocker = new object();
-
///
- /// 写入日志文件流
+ /// 写入日志文件缓冲
///
///
/// 转码后的字符串
- private void Write(byte[] info)
+ private void Write(string info)
{
- if (info == null)
- return;
-
- try
- {
- lock (_fileLocker)
- {
- _logFileStream.Write(info, 0, info.Length);
- }
- }
- catch (Exception e)
- {
- Logging.Warning($"写入 {Name} 日志错误:\n" + e.Message);
- }
+ _logBuffer.Append(info + Global.EOF);
}
}
}
\ No newline at end of file