代码如下、 using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication1 { class CInternalMsg { private DateTime dt; private string msg; public CInternalMsg(string sMsg) { dt = DateTime.Now; msg = sMsg; } public void Save() { System.IO.FileStream fs = new System.IO.FileStream(@"C:/log.txt", System.IO.FileMode.Append, System.IO.FileAccess.Write); System.IO.StreamWriter sw = new System.IO.StreamWriter(fs); sw.Write("时间"); sw.WriteLine(dt); sw.Write("内容:"); sw.WriteLine(msg ); sw.Close (); fs.Close (); } public void savetest() { Console.Write("时间:"); Console.WriteLine(dt); Console.Write("内容:"); Console.WriteLine(msg); } } class CLogQueue { //使用队列对象存放消息 private Queue m_objQueue = new Queue(); //是否停止后台线程 private bool m_bstop = true; //为了测试方便,记录日志消息队列所记录的日志数目; private long m_nCount; //保存线程的引用 private Thread m_objThread = null; //外部调用接口:启动队列功能 public void start() { //设置启动标志 m_bstop = false; CInternalMsg objMsg = new CInternalMsg(string.Format("日志队列准备启动......")); objMsg.Save(); //创建后线程 m_objThread = new Thread(new ThreadStart(fnLogThread)); m_objThread.Start(); } public void stop() { CInternalMsg objMsg = new CInternalMsg(string.Format("日志队列准备停止......")); objMsg.Save(); m_bstop = true; if (m_objThread != null) { m_objThread.Join(); m_objThread = null; } } private void fnLogThread() { CInternalMsg objMsg = new CInternalMsg("日志队列已启动"); objMsg.Save(); while (true) { if (m_objQueue.Count > 0) { objMsg = new CInternalMsg("批处理---------------------------------"); objMsg.Save(); lock (m_objQueue.SyncRoot) { while (m_objQueue.Count > 0) { objMsg = m_objQueue.Dequeue() as CInternalMsg; if (objMsg != null) { objMsg.Save(); } m_nCount++; } } } if (m_bstop) break; Thread.Sleep(5000); } objMsg=new CInternalMsg (string.Format("日志队列已经停止,记录数目:{0}",m_nCount )); objMsg.Save(); } public void Log(string sMsg) { CInternalMsg objMsg = new CInternalMsg(sMsg); lock (m_objQueue.SyncRoot ) { m_objQueue.Enqueue(objMsg); } } } class CModule { private string m_sName; public CModule(string sName) { m_sName = sName; } public void run(object CLog ) { Random rnd = new Random(DateTime.Now.Millisecond); for (int i = 0; i < 100; i++) { string sMsg = string.Format("模块{0}: 请求{1}", m_sName, rnd.Next()); ((CLogQueue)CLog).Log(sMsg); Thread.Sleep(200); } } } class Program { static void Main(string[] args) { CLogQueue Clg = new CLogQueue(); Clg.start(); const int nCount = 10; CModule[] arrModules = new CModule[nCount]; Thread[] arrThread = new Thread[nCount]; for (int i = 0; i < nCount; i++) { arrModules[i]=new CModule (string.Format ("{0}",(char)('A'+i))); arrThread[i]=new Thread (arrModules[i].run); arrThread[i].Start(Clg); } for (int i=0 ;i<10;i++) { arrThread[i].Join (); } Clg.stop (); } } }