要知道我想在我的代碼做的,下面是singletone類我在C#中實現
公共密封類FileWriteTest {
private static volatile FileWriteTest instance;
private static object syncRoot = new Object();
private static Queue logMessages = new Queue();
private static ErrorLogger oNetLogger = new ErrorLogger();
private FileWriteTest() { }
public static FileWriteTest Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new FileWriteTest();
Thread MyThread = new Thread(new ThreadStart(StartCollectingLogs));
MyThread.Start();
}
}
}
return instance;
}
}
private static void StartCollectingLogs()
{
//Infinite loop
while (true)
{
cdoLogMessage objMessage = new cdoLogMessage();
if (logMessages.Count != 0)
{
objMessage = (cdoLogMessage)logMessages.Dequeue();
oNetLogger.WriteLog(objMessage.LogText, objMessage.SeverityLevel);
}
}
}
public void WriteLog(string logText, SeverityLevel errorSeverity)
{
cdoLogMessage objMessage = new cdoLogMessage();
objMessage.LogText = logText;
objMessage.SeverityLevel = errorSeverity;
logMessages.Enqueue(objMessage);
}
}
當我在調試模式下運行此代碼(僅模擬一個用戶訪問),則會在隊列出隊的行處出現錯誤「堆棧溢出」。
注意:在上面的代碼中ErrorLogger是一個有代碼寫入文件的類。 objMessage是一個攜帶日誌消息的實體類。
Mutex lockobj = new Mutex(false,「mymutex」); 將編譯 – 2009-07-07 15:32:57
在創建它之前,您應該嘗試先使用該名稱打開現有的Mutex。否則,該「新的互斥體(...)」行可能會拋出異常。 我也建議使用一個try/catch/finally塊,釋放呼叫移動進入finally塊,只釋放它,如果你確實拿到了鎖。 – 2012-02-29 20:34:27