可以为一个定时任务创建多个触发器。如果您创建59个相同的触发器,每个偏移1秒,并将任务本身安排在每分钟运行一次,则最终安排的任务将每秒运行一次。
您可以使用GUI手动创建这59个触发器。然而,更快捷的方法是创建一个有一到两个触发器的任务,将其导出到文本文件中,复制相应的行,根据需要更改起始偏移量,然后重新导入文件。
我实际上成功地做到了这一点。
更新:似乎我把它弄复杂了。
在触发器中,在“重复任务每次:”的位置,你可以输入“1分钟”进下拉菜单(不支持秒数输入)
我在一台Windows 7机器上完成了这个操作。
显然,我没有仔细阅读问题,因为提问者似乎已经能够将时间缩短到1分钟。但是,我将保留这个答案,因为它将为未来的读者解释如何将时间缩短到1分钟。
似乎无法使其以小于一分钟的间隔运行。
我设置了一个触发器,将其设置为每天重复1天。
我勾选了“重复任务每次:”框。将其设置为每5分钟一次,持续1天。
这使得任务每5分钟无限循环。
然后我导出了这个任务。它导出为一个.xml文件。
在任务> 触发器> 日历触发器> 重复
下有以下标记:<Interval>PT5M</Interval>
我将其从PT5M
更改为PT1M
。我重新导入了这个任务。
现在任务每1分钟运行一次。
我还没有完全测试过,也没有尝试过少于1分钟的时间,但通过设置PT30S
或30秒之类的东西可能是可行的。我会试一下并报告结果。更新:你不能这样做,导入任务时会出错。不可能将此时间设置为小于1分钟。
对我来说,整个触发器看起来像这样:
<Triggers>
<CalendarTrigger>
<Repetition>
<Interval>PT1M</Interval>
<Duration>P1D</Duration>
<StopAtDurationEnd>false</StopAtDurationEnd>
</Repetition>
<StartBoundary>2013-11-07T17:04:51.6062297</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
简要说明: 主程序启动一个服务进程,该进程将保持活动状态,并定期激活一个作业 - 执行某些操作。
这是我为.NET/Mono中的Windows服务和Linux守护进程提供的模板C#解决方案 https://github.com/mchudinov/ServiceDemon 以及有关此解决方案的简短博客文章
class Program
{
public static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new ServiceDemon.Service() };
ServiceBase.Run(ServicesToRun);
}
}
public class Service : ServiceBase
{
static IScheduler Scheduler { get; set; }
protected override void OnStart(string[] args)
{
StartScheduler();
StartMyJob();
}
protected override void OnStop()
{
Scheduler.Shutdown();
}
void StartScheduler()
{
ISchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler = schedFact.GetScheduler();
Scheduler.Start();
}
void StartMyJob()
{
var seconds = Int16.Parse(ConfigurationManager.AppSettings["MyJobSeconds"]);
IJobDetail job = JobBuilder.Create<Jobs.MyJob>()
.WithIdentity("MyJob", "group1")
.UsingJobData("Param1", "Hello MyJob!")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("MyJobTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
.Build();
Scheduler.ScheduleJob(job, trigger);
}
}
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
log.Info(dataMap["Param1"]);
}
}