要知道我想在我的代码做的,下面是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