读书人

c#队列写日志求教解决办法

发布时间: 2012-04-12 15:46:35 作者: rapoo

c#队列写日志求教
c#日志类,生产-消费模式。

日志直接写入队列,另一线程负责将队列写入文件。

问题:将队列写入文件两种方法,一个用线程循环,一个异步执行,请问哪一种比较好?或者有更好的方法。网高手指点,感激。(vs2010 winform)
方法一:

C# code
 /// <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();                        }                    }                }            }。。。。。。。


方法二:
C# code
 /// <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();            }。。。。。 



[解决办法]
一个生产者 一个消费者

感觉 你的异步 可以不用 while


C# code
 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)的方式,感觉不踏实 ,我选第二种

读书人网 >C#

热点推荐