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