c# - 记录器类的 StreamWriter 的 C# 正确实现
问题描述
我的项目遇到了一个奇怪的问题。
这是我的记录器类:
using System.Diagnostics;
using System.IO;
namespace someSpace
{
public enum LogTarget
{
File, Database, EventLog
}
public static class LogHelper
{
private static LogBase logger = null;
public static void Log(LogTarget target, string path, string message)
{
switch (target)
{
case LogTarget.File:
logger = new FileLogger();
logger.Log(path, message);
break;
case LogTarget.EventLog:
logger = new EventLogger();
logger.Log("", message);
break;
default:
return;
}
}
}
public abstract class LogBase
{
protected readonly object lockObj = new object();
public abstract void Log(string path, string message);
}
public class FileLogger : LogBase
{
public override void Log(string path, string message)
{
lock (lockObj)
{
File.Open(path, FileMode.Open).Close();
using (StreamWriter streamWriter = new StreamWriter(path))
{
streamWriter.WriteLine(message);
streamWriter.Close();
}
}
}
}
public class EventLogger : LogBase
{
public override void Log(string path, string message)
{
lock (lockObj)
{
EventLog m_EventLog = new EventLog("");
m_EventLog.Source = "IDGEventLog";
m_EventLog.WriteEntry(message);
}
}
}
}
我这样调用函数 Log ......
LogHelper.Log(LogTarget.File, LOG_FILE_PATH, e.ToString());
我假设通过在我的类中使用构造“使用”,流将自动关闭,随后文件将被关闭并释放。
这不会发生;程序的后续运行一直说该文件仍在被某个进程使用。我不知道如何诊断问题。
lock (lockObj)
{
var file = File.Open(path, FileMode.Open);
using (StreamWriter streamWriter = new StreamWriter(file))
{
streamWriter.WriteLine(message);
streamWriter.Close();
}
file.Close();
}
也以这种方式修改为提示评论但问题仍然存在......
解决方案
每次调用 Log 都会创建一个带有自己 lockObj 的新记录器,其他记录器不会被锁定。使 lockObj 成为静态成员。
推荐阅读
- reactjs - 我的 React Auth 组件上的登录按钮在移动设备上不起作用
- r - R列检查是否包含来自另一列的值
- r - 如何使用 createPartition 进行分区
- c - 任何人都可以帮助我使用信号量创建死锁吗?
- php - html表单输入数字中美元和美分的模式是什么?
- python-3.x - 如何限制并行进程
- javascript - 用 js 成功扭转了过渡,但为什么我的另一种方式不起作用?
- python - 在 google colab 上的 google drive 中的视频上使用 openpose
- r - 如何生成组间成对共享矩阵并将其可视化
- javascript - 从模板中获取元素兄弟组件 ng-content