本人最近的項目中需要用到日志文件,由於對日志文件的讀寫可能比較頻繁, 為了克服讀寫沖突,我們在設計中引入了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());
}
}
再設計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)
...{
// 讀取日志文件
}
}
}
LogHandler采用單例模式,保證了同一時間內只有一個線程對日志文件進行操作,讀/寫方法中分別用Lock互斥鎖鎖定這個唯一的對象,這樣就避免了日志文件的讀寫沖突,具體可參看MSDN對於Lock關鍵字的介紹。當然,C#提供的ReaderWriterLock讀寫鎖也可以解決這一問題。