QuartZ的线程锁
2015-09-08 22:06
369 查看
1. 自定义QuartZ的并发锁
using System; using System.Threading; using log4net; using Quartz; namespace HK.Gramma.Business { public class FirstTimeJob : IJob { /// <summary> /// 日志工具 /// </summary> private static readonly ILog Logger = LogManager.GetLogger("FirstTimeJob"); /// <summary> /// 线程对象 /// </summary> private static readonly object SyncObj = new object(); /// <summary> /// 任务运行标识 /// </summary> private static bool _isRunning; /// <summary> /// 线程访问计数 /// </summary> private static int _visitCount = 0; /// <summary> /// 执行定时任务 /// </summary> /// <param name="context">上下文</param> public void Execute(IJobExecutionContext context) { lock (SyncObj) { if (_isRunning) { return; } _isRunning = true; } try { Logger.InfoFormat("开始任务,线程ID={0}", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(5000); _visitCount++; Logger.InfoFormat("结束任务,线程ID={0},访问总数={1}", Thread.CurrentThread.ManagedThreadId, _visitCount); } catch (Exception ex) { Logger.ErrorFormat("任务异常\r\n{0}", ex); } finally { lock (SyncObj) { _isRunning = false; } } } } }2. 使用QuartZ. DisallowConcurrentExecutionAttribute 可以简化并发锁的处理。
using System; using System.Threading; using log4net; using Quartz; namespace HK.Gramma.Business { [DisallowConcurrentExecution] public class SecondTimeJob : IJob { /// <summary> /// 线程访问计数 /// </summary> private static int _visitCount = 0; /// <summary> /// 日志工具 /// </summary> private static readonly ILog Logger = LogManager.GetLogger("SecondTimeJob"); /// <summary> /// 执行定时任务 /// </summary> /// <param name="context">上下文</param> public void Execute(IJobExecutionContext context) { try { Logger.InfoFormat("开始任务,线程ID={0}", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(5000); _visitCount++; Logger.InfoFormat("结束任务,线程ID={0},访问总数={1}", Thread.CurrentThread.ManagedThreadId, _visitCount); } catch (Exception ex) { Logger.ErrorFormat("任务异常\r\n{0}", ex); } } } }测试结果如下
2015-09-08 20:42:30,001 [ServiceScheduler_Worker-2] INFO SecondTimeJob [(null)] - 开始任务,线程ID=4 2015-09-08 20:42:35,001 [ServiceScheduler_Worker-2] INFO SecondTimeJob [(null)] - 结束任务,线程ID=4,访问总数=1 2015-09-08 20:42:35,001 [ServiceScheduler_Worker-6] INFO SecondTimeJob [(null)] - 开始任务,线程ID=8 2015-09-08 20:42:40,002 [ServiceScheduler_Worker-6] INFO SecondTimeJob [(null)] - 结束任务,线程ID=8,访问总数=2 2015-09-08 20:42:40,002 [ServiceScheduler_Worker-9] INFO SecondTimeJob [(null)] - 开始任务,线程ID=11 2015-09-08 20:42:45,003 [ServiceScheduler_Worker-9] INFO SecondTimeJob [(null)] - 结束任务,线程ID=11,访问总数=3 2015-09-08 20:42:45,003 [ServiceScheduler_Worker-4] INFO SecondTimeJob [(null)] - 开始任务,线程ID=6 2015-09-08 20:42:50,004 [ServiceScheduler_Worker-4] INFO SecondTimeJob [(null)] - 结束任务,线程ID=6,访问总数=4 2015-09-08 20:42:50,004 [ServiceScheduler_Worker-7] INFO SecondTimeJob [(null)] - 开始任务,线程ID=9 2015-09-08 20:42:55,004 [ServiceScheduler_Worker-7] INFO SecondTimeJob [(null)] - 结束任务,线程ID=9,访问总数=5 2015-09-08 20:42:55,005 [ServiceScheduler_Worker-1] INFO SecondTimeJob [(null)] - 开始任务,线程ID=3 2015-09-08 20:43:00,006 [ServiceScheduler_Worker-1] INFO SecondTimeJob [(null)] - 结束任务,线程ID=3,访问总数=6 2015-09-08 20:43:00,007 [ServiceScheduler_Worker-5] INFO SecondTimeJob [(null)] - 开始任务,线程ID=7 2015-09-08 20:43:05,007 [ServiceScheduler_Worker-5] INFO SecondTimeJob [(null)] - 结束任务,线程ID=7,访问总数=7 2015-09-08 20:43:05,007 [ServiceScheduler_Worker-6] INFO SecondTimeJob [(null)] - 开始任务,线程ID=8 2015-09-08 20:43:10,008 [ServiceScheduler_Worker-6] INFO SecondTimeJob [(null)] - 结束任务,线程ID=8,访问总数=8 2015-09-08 20:43:10,012 [ServiceScheduler_Worker-3] INFO SecondTimeJob [(null)] - 开始任务,线程ID=5 2015-09-08 20:43:15,012 [ServiceScheduler_Worker-3] INFO SecondTimeJob [(null)] - 结束任务,线程ID=5,访问总数=9 2015-09-08 20:43:15,012 [ServiceScheduler_Worker-4] INFO SecondTimeJob [(null)] - 开始任务,线程ID=6 2015-09-08 20:43:20,013 [ServiceScheduler_Worker-4] INFO SecondTimeJob [(null)] - 结束任务,线程ID=6,访问总数=10
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析
- 探究在C++程序并发时保护共享数据的问题
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)
- C#实现多线程的Web代理服务器实例
- c#实现多线程局域网聊天系统
- PHP使用CURL实现多线程抓取网页
- 浅解关于C#多线程的介绍