我正在接管一個C#項目,當測試它時,我收到錯誤。錯誤在於日誌文件無法寫入,因爲它正在被另一個進程使用。下面的代碼:Streamwriter Lock不能正常工作
public void WriteToLog(string msg)
{
if (!_LogExists)
{
this.VerifyOrCreateLogFile(); // Creates log file if it does not already exist.
}
// do the actual writing on its own thread so execution control can immediately return to the calling routine.
Thread t = new Thread(new ParameterizedThreadStart(WriteToLog));
t.Start((object)msg);
}
private void WriteToLog(object msg)
{
lock (_LogLock)
{
string message = msg as string;
using (StreamWriter sw = File.AppendText(LogFile))
{
sw.Write(message);
sw.Close();
}
}
}
_LogLock被定義爲一個類變量:
private object _LogLock = 0;
根據我的研究,事實上,這已經在生產系統了幾年,現在做工精細,我不知道問題可能是什麼。該鎖應該防止另一個線程嘗試寫入日誌文件。
我所做的需要測試的更改有更多的日誌使用情況。我們基本上添加了一個調試模式,以便將比以前更多的信息保存到日誌中。
感謝您的幫助!
編輯:
感謝您的快速解答! VerifyOrCreateLogFile()的代碼確實使用了_LogLock,所以這不應該成爲問題。在錯誤出來之前,它會對日誌做一些寫操作,所以它通過創建文件就可以了。
什麼似乎是問題是以前只有一個類創建了一個日誌類的實例,現在我已經將實例添加到其他類。這是有道理的,這會造成問題。將_LogLock字段更改爲靜態可以解決問題。
再次感謝!
不僅有那些方法屬於類的單一實例?我問的原因是因爲鎖只會使用相同的實例保護兩個線程。寫入同一個文件的兩個實例會愉快地彼此相向。 – hatchet
@Greg:你可以共享VerifyOrCreateLogFile()方法的代碼,也許它在某些情況下忘記釋放日誌文件句柄?我希望提到的方法在訪問文件時使用_LogLock ... – sll
VerifyOrCreateLogFile()中可能發生異常 - 是否也受保護? – Polyfun