自己最近写的一组日志处理类(线程调度优化)
2012-04-01 08:18
197 查看
前面分享的一篇文章<<自己最近写的一组日志处理类(支持高并发处理)>>里写了一个多线程的写日志的类,当时测试的时候没有太注意,后面发现这个日志类占用cpu太厉害,经过调试发现问题出在对于线程的挂起(Suspend)和唤醒(Resume)上面(这两个方法已经在新的框架里里面被废掉了).我调用这两个方法的目的就是在没有日志写的时候,线程不要再运行,等待有需要写日志的时候再继续工作.后面改了一种方式来实现这个目的,CPU占用问题就解决了,当然下面的这种方式也是对线程挂起和唤醒的一种新的替代方式,下面是修改后的代码,注释很详细,原来的代码大家请参考前面的博文:
/// <summary> /// 定义一个信号变量,采用的是ManualResetEvent /// </summary> private ManualResetEvent resumeEvent = new ManualResetEvent(false); /// <summary> /// 定义一个变量,用于记录线程是否处在pause状态. /// </summary> private volatile bool FPaused = false; /// <summary> /// 线程挂起 /// </summary> public void Pause() { //如果当前线程不处在挂起状态就进行挂起操作 if (FPaused == false) { FPaused = true; //重新设置信号量为初始状态 resumeEvent.Reset(); //进行线程等待. resumeEvent.WaitOne(); } } /// <summary> /// 唤醒线程并继续执行 /// </summary> public void Resume() { //如果在运行就不进行唤醒操作 if (FPaused == true) { FPaused = false; //唤醒所有等待线程,本例中等待的只有当前写线程(因此也可以用AutoResetEvent来实现). resumeEvent.Set(); } } private void WriteLogToFile() { while (FStop==false) { try { //_streamWriter.Flush(); //Thread.Sleep(10000); string theLogContent = null; //队列操作时需要锁定,否则会报错.队列并不是线程安全的. //但多个队列可以同时写. lock (this) { theLogContent = _logCaches.Dequeue(); } if (theLogContent != null && theLogContent != "") { _streamWriter.WriteLine(DateTime.Now.ToString() + ": " + theLogContent); _streamWriter.Flush(); LastExecTime = DateTime.Now; } //修改调整处 //如果日志缓冲区为空,则挂起当前线程. if (_logCaches.Count <= 0) { this.Pause(); } } catch (Exception ex) { SysAppEventWriter.WriteEvent(-1, ex.Message, System.Diagnostics.EventLogEntryType.Error); } } }
相关文章推荐
- 自己最近写的一组日志处理类(线程调度优化)
- 自己最近写的一组日志处理类(支持高并发处理)
- 自己最近写的一组日志处理类(支持高并发处理)
- Android全局异常处理 实现自己定义做强制退出和carsh日志抓取
- Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统
- 自己封装的php Curl并发处理,欢迎提出问题优化。
- 【日志处理】logstash性能优化配置
- [人生日志]最近重新找工作和一些自己想做的事情
- SQL--处理表重复记录(查询和删除) 示例:查询最近一条用户登陆日志
- rsyslog + postfix 把postfix调用rsyslog生成的mail日志转向给自己处理的处理脚本+配置
- SQL--处理表重复记录(查询和删除) 示例:查询最近一条用户登陆日志
- 百度海量日志处理——任务调度实践与优化
- 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
- 发一组比较常用的编码/加解密算法集....大部分是网上收集代码然后自己再处理下的~~~
- 已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张,现在要求只能保留最近 7 天的访问日志!请问如何解决? 请给出解决办法或配置或处理命令。(提示:可以
- jdbc插入大量数据时优化处理-最近遇到的解决我一大难题
- 在PCH中定制自己的LOG打印日志,分别在DEBUG 与 RELEASE的状态下处理,及如何把PCH引入到项目中
- 最近一直处理数据库,真麻烦啊,把具体步骤写下来,供自己参考!
- Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统
- 最近在为界面库中增加一个单独的换肤功能,自己记录下GDI渐变色的使用方法