[英]Delay in a WinForms app without using “await Task.Delay(x)”
[英]Quartz job not execute without Task.Delay
這是我的工作:
public class MyJob: IJob
{
public static bool run = true;
public Task Execute(IJobExecutionContext context)
{
logger.Info("Start MyJob");
}
}
這是我的課程:
private static ILogger logger = LogManager.GetCurrentClassLogger();
private static IJob MyJob;
static void Main(string[] args)
{
try
{
logger.Info("Start");
RunProgram().GetAwaiter().GetResult();
logger.Info("Completed");
}
catch (Exception ex)
{
logger.Error($"error");
}
}
private static async Task RunProgram()
{
try
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
await Task.Delay(TimeSpan.FromSeconds(10));
await scheduler.Shutdown();
}
catch (SchedulerException se)
{
await Console.Error.WriteLineAsync(se.ToString());
}
}
上面的代碼正在運行。
觸發器設置 MyJob 每 5 秒運行一次。 Task.Delay() 使程序在 10 秒后終止。 所以 MyJob 將被執行兩次。
我想等到工作完成而不是設置計時器,所以我閱讀了石英教程並像這樣修改 RunProgram() :
private static async Task RunProgram()
{
try
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start(); //++
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity("job1", "group1")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
await scheduler.ScheduleJob(job, trigger);
//--await scheduler.Start();
//--await Task.Delay(TimeSpan.FromSeconds(10))
//--await scheduler.Shutdown();
}
catch (SchedulerException se)
{
await Console.Error.WriteLineAsync(se.ToString());
}
}
然后 MyJob 永遠不會被執行。
有什么不對?
嗨,您可以嘗試刪除 StartNow()。 從下面的代碼
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(5)
.RepeatForever())
.Build();
此外,請嘗試使用此處提到的 crone 觸發器。
只需在 Main 方法中添加 Console.ReadLine() 即可。 這將防止您的應用程序終止。
static void Main(string[] args)
{
try
{
logger.Info("Start");
RunProgram().GetAwaiter().GetResult();
logger.Info("Completed");
Console.ReadLine();
}
catch (Exception ex)
{
logger.Error($"error");
}
}
可以在這里找到更好的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.