c#队列写日志求教
c#日志类,生产-消费模式。
日志直接写入队列,另一线程负责将队列写入文件。
问题:将队列写入文件两种方法,一个用线程循环,一个异步执行,请问哪一种比较好?或者有更好的方法。网高手指点,感激。(vs2010 winform)
方法一:
/// <summary> /// 日志对象的缓存队列 /// </summary> private static Queue<Msg> msgsQueue; /// <summary> /// 日志文件保存的路径 /// </summary> private static string path = "Logs\\"; /// <summary> /// 日志写入文件线程的控制标记 /// </summary> private static bool state; /// <summary> /// 日志文件生命周期的时间标记 /// </summary> private static DateTime TimeSign; /// <summary> /// 日志文件写入流对象 /// </summary> private static StreamWriter writer; /// <summary> /// 初始化 /// </summary> public QueueManager() { if (msgsQueue == null) { state = true; if (!Directory.Exists(path)) Directory.CreateDirectory(path); msgsQueue = new Queue<Msg>(); Thread thread = new Thread(work); thread.Start(); } } /// <summary> /// 写入新日志,根据指定的日志对象Msg /// </summary> /// <param name="msg">日志内容对象</param> private void WriteToQueue(Msg msg) { if (msg != null) { lock (msgsQueue) { msgsQueue.Enqueue(msg); } } } /// <summary> /// 日志写入文件线程执行的方法,消费者 /// </summary> private void work() { while (true) { Msg msg = null; //判断队列中是否存在待写入的日志 if (msgsQueue.Count > 0) { lock (msgsQueue) { msg = msgsQueue.Dequeue(); } if (msg != null) { WriteToFile(msg); } } else { //判断是否已经发出终止日志并关闭的消息 if (state) { Thread.Sleep(1); } else { FileClose(); } } } }。。。。。。。
/// <summary> /// 日志对象的缓存队列 /// </summary> private static Queue<Msg> msgsQueue; /// <summary> /// 日志文件保存的路径 /// </summary> private static string path = "Logs\\"; /// <summary> /// 日志写入文件线程的控制标记,true为正在写入 /// </summary> private static bool state=false; /// <summary> /// 日志文件生命周期的时间标记 /// </summary> private static DateTime TimeSign; /// <summary> /// 日志文件写入流对象 /// </summary> private static StreamWriter writer; private delegate void workDelegate(); private static workDelegate wd; /// <summary> /// 初始化 /// </summary> public QueueManager() { if (msgsQueue == null) { if (!Directory.Exists(path)) Directory.CreateDirectory(path); msgsQueue = new Queue<Msg>(); wd = new workDelegate(work); } } /// <summary> /// 写入新日志,根据指定的日志对象Msg /// </summary> /// <param name="msg">日志内容对象</param> private void WriteToQueue(Msg msg) { if (msg != null) { lock (msgsQueue) { msgsQueue.Enqueue(msg); } } if (msgsQueue.Count>0&&!state) { state = true; wd.BeginInvoke(null, null); } } /// <summary> /// 日志写入文件线程执行的方法,消费者 /// </summary> private void work() { Msg msg = null; //判断队列中是否存在待写入的日志 while (msgsQueue.Count > 0) { lock (msgsQueue) { msg = msgsQueue.Dequeue(); } if (msg != null) { WriteToFile(msg); } } state = false; FileClose(); }。。。。。
private static void work() { Msg msg = null; //判断队列中是否存在待写入的日志 lock (msgsQueue) { if (msgsQueue.Count > 0) { msg = msgsQueue.Dequeue(); } if (msg != null) { WriteToFile(msg.name); } } // state = false; }
[解决办法]
我不喜欢用while (true)的方式,感觉不踏实 ,我选第二种