c#队列写日志求教

文少 2012-04-04 07:06:04
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();
}
。。。。。
...全文
344 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
orochiheart 2012-04-05
  • 打赏
  • 举报
回复
我不喜欢用while (true)的方式,感觉不踏实 ,我选第二种
文少 2012-04-05
  • 打赏
  • 举报
回复
顶起来,希望大家能探讨下。。。
startstartsvip 2012-04-04
  • 打赏
  • 举报
回复
我感觉我在 2楼的说法有问题,你异步的本意是一个生产者,一个消费者...,嗯,等高手来看看吧

文少 2012-04-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

一个生产者 一个消费者

感觉 你的异步 可以不用 while


C# code

private static void work()
{
Msg msg = null;
//判断队列中是否存在待写入的日志

lock ……
[/Quote]
但是有大量数据进入队列时(生产),这时候还来不及全部生产日志(消费进度跟不上),就需要,这里队列起到了缓冲的作用。
startstartsvip 2012-04-04
  • 打赏
  • 举报
回复
一个生产者 一个消费者

感觉 你的异步 可以不用 while



private static void work()
{
Msg msg = null;
//判断队列中是否存在待写入的日志

lock (msgsQueue)
{
if (msgsQueue.Count > 0)
{
msg = msgsQueue.Dequeue();
}
if (msg != null)
{
WriteToFile(msg.name);
}
}


// state = false;

}

文少 2012-04-04
  • 打赏
  • 举报
回复
自己觉得消费的时候用线程无限等待没有异步处理好,不知道对不对?

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧