写日志方法的改进

最近写了个程序,需要记录日志,方法是把需要记录的信息放到一个队列里,开个线程去队列里取信息,写到本地文件;

当主程序关闭时,写日志线程也关闭,程序正常退出。


在debug过程中,发现当关闭程序时,队列里其实堆积了很多条记录还没有写到本地文件, 如果这时直接queue.clear(),将会导致日志信息丢失;

所以在写日志线程关闭前,加个循环 while(queue.count > 0) {},这样可以保证日志信息写完再退出程序。


但其实这治标不治本,重点是为什么写的较慢?

后来发现了三个地方可以改进的:

1 while (StartEvent.WaitOne(10) == true)  //阻塞线程10毫秒;

{

WriteLog(); // 写日志方法;

}

其实阻塞10毫秒都有点长了,可以更短一些;

2 WriteLog()

{

string msg = MsgQueue.Dequeue();

    var logStreamWriter = new StreamWriter(fileName, true);
     logStreamWriter.WriteLine(msg );
     logStreamWriter.Close();

}


线程好不容易获得了一次时间片,结果只写了一条记录,太浪费了;

所以在写日志方法里,加个循环,执行个20次,保证充分利用时间片;


3 在写日志方法里,每写一条记录就new一个streamwriter,打开文件,写好再关闭文件,文件较小还可以,若文件比较大,耗时就会比较多了

所以改成打开一次文件,执行20次也就是写20条记录再关闭,效果会更好。



20140626 修改:

“其实阻塞10毫秒都有点长了,可以更短一些;”,这句话是有误的!!

StartEvent.WaitOne(10) 的意思是:

该线程在间隔多长时间后从主线程接收消息,比如主线程关闭了,但该线程要等到 10 ms后才会接收。


举两个例子:

startevent.waitone(10000): 点击了关闭程序,但10s后才会关闭;

startevent.waitone(-1): 无限期间隔时间,也就意味着该线程将不会被关闭。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值