【发布时间】:2017-07-28 14:45:13
【问题描述】:
我正在尝试在我的 Windows 服务中安排一个任务,以便每周运行脚本。 我不想通过 sql 作业来做。 有什么想法吗?
【问题讨论】:
标签: c# sql windows-services taskscheduler
我正在尝试在我的 Windows 服务中安排一个任务,以便每周运行脚本。 我不想通过 sql 作业来做。 有什么想法吗?
【问题讨论】:
标签: c# sql windows-services taskscheduler
您可以为此使用Quartz 调度库。它支持 CRON 触发器。所以你可以定义一个简单的工作,比如:
public class Sqljob : IJob
{
#region Constructors
public Sqljob()
{
}
#endregion
#region IJob members
public void Execute(IJobExecutionContext context)
{
// Perform your SQl work here
}
#endregion
}
并有一个调度程序来实例化和调度作业以及触发器:
public class TaskScheduler : ITaskScheduler
{
#region Private fields
private readonly IScheduler _scheduler;
#endregion
#region Constructors
public TaskScheduler(IScheduler scheduler)
{
_scheduler = scheduler;
}
#endregion
#region ITaskScheduler members
public string Name
{
get { return this.GetType().Name; }
}
public void Run()
{
ScheduleSqlJob();
_scheduler.Start();
}
public void Stop()
{
if (_scheduler != null) _scheduler.Shutdown(true);
}
#endregion
#region Private methods
private void ScheduleSqlJob()
{
var jobDetails = JobBuilder.Create<Sqljob>()
.WithIdentity("Sqljob")
.Build();
var trigger = TriggerBuilder.Create()
.StartNow()
.WithCronSchedule("// Get your CRON expression here"))
.Build();
_scheduler.ScheduleJob(jobDetails, trigger);
}
#endregion
}
您的服务可以像这样调用调度程序:
public partial class MyService : ServiceBase
{
#region Fields
private readonly ITaskScheduler _taskScheduler;
#endregion
public MyService(ITaskScheduler taskScheduler)
{
InitializeComponent();
_taskScheduler = taskScheduler;
}
protected override void OnStart(string[] args)
{
_taskScheduler.Run();
}
protected override void OnStop()
{
_taskScheduler.Stop();
}
}
【讨论】: