本人最近的项目中需要用到日志文件,由于对日志文件的读写可能比较频繁, 为了克服读写冲突,我们在设计中引入了Singleton模式。
首先,设计日志文件对象,包括Open和Save方法:
[Serializable]
public class LogDocument
... {
/**//// <summary>
/// 从日志文件中得到LogDocument对象
/// </summary>
public LogDocument Open(string fileName)
...{
}
/**//// <summary>
/// 写日志文件
/// </summary>
public void Save(string fileName)
...{
File.WriteAllText(fileName, GetXml());
}
}
public class LogDocument
... {
/**//// <summary>
/// 从日志文件中得到LogDocument对象
/// </summary>
public LogDocument Open(string fileName)
...{
}
/**//// <summary>
/// 写日志文件
/// </summary>
public void Save(string fileName)
...{
File.WriteAllText(fileName, GetXml());
}
}
再设计LogHandler类,用来读写日志文件:
/**/
/// <summary>
/// 日志文件处理类
/// </summary>
public class LogHandler
... {
private LogHandler()...{}
private static LogHandler instance = new LogHandler();
public static LogHandler Instance
...{
get
...{
if (instance == null)
...{
instance = new LogHandler();
}
return instance;
}
}
/**//// <summary>
/// 写入日志
/// </summary>
public void Write()
...{
lock(Instance)
...{
//写入日志
}
}
/**//// <summary>
/// 读取日志文件
/// </summary>
public void Read()
...{
lock(Instance)
...{
// 读取日志文件
}
}
}
/// 日志文件处理类
/// </summary>
public class LogHandler
... {
private LogHandler()...{}
private static LogHandler instance = new LogHandler();
public static LogHandler Instance
...{
get
...{
if (instance == null)
...{
instance = new LogHandler();
}
return instance;
}
}
/**//// <summary>
/// 写入日志
/// </summary>
public void Write()
...{
lock(Instance)
...{
//写入日志
}
}
/**//// <summary>
/// 读取日志文件
/// </summary>
public void Read()
...{
lock(Instance)
...{
// 读取日志文件
}
}
}
LogHandler采用单例模式,保证了同一时间内只有一个线程对日志文件进行操作,读/写方法中分别用Lock互斥锁锁定这个唯一的对象,这样就避免了日志文件的读写冲突,具体可参看MSDN对于Lock关键字的介绍。当然,C#提供的ReaderWriterLock读写锁也可以解决这一问题。