use*_*607 5 c# quartz-scheduler quartz.net
我对使用 Quartz 很陌生,我有一个关于触发器的问题。是否可以根据文件存在触发?我想让 Quartz 运行一项作业,直到找到某个文件,然后停止运行该作业,也许会继续进行另一个作业。
例如,我想做这样的事情:
(1) Job1 每 60 秒检查一次给定目录中是否存在 File.txt。
(2)如果找到File.txt,则触发Job2启动。Job1 停止检查文件是否存在。
现在,我有:
// Job definitions
var Job1 = JobBuilder.Create<TestEmail>().WithIdentity("job1", "group1").Build();
var Job2 = JobBuilder.Create<TestFileTrigger>().WithIdentity("job2", "group2").Build();
// Triggers
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1").StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("trigger2", "group2").StartNow()
.Build();
// Schedule jobs
scheduler.ScheduleJob(Job1, trigger1);
if (TestFileTrigger.fileExistence == true)
{
scheduler.ScheduleJob(Job2, trigger2);
}
Run Code Online (Sandbox Code Playgroud)
但似乎 Job2 永远不会启动。
TestEmail 和 TestFileTrigger 目前只是简单地打印到控制台。布尔 TestFileTrigger.fileExistence 来自检查文件是否存在于给定位置(它确实存在)。
编辑: TestFileTrigger.fileExistence 是一个布尔值。如果有帮助,添加了 Job1/Job2 的定义。
编辑:我发现如果我放在Thread.Sleep(TimeSpan.FromSeconds(x));if 语句之前,如果满足条件,if 语句就会运行。(其中 x 是一些秒数。)为什么它在这种情况下有效,但在其他情况下无效?我不能总是知道满足条件需要多少秒。
看来您不了解这里涉及的并发和线程。
问题如下。
您的 MAIN 线程执行以下操作。
TestFileTrigger.fileExistence,如果为 true,则启动 Job2(为 false,因此不会运行)。然后线程池线程将启动 Job1。最有可能的设定TestFileTrigger.fileExistence = true。但主线程已经完成了它的工作。
鳍。
你永远不会回去检查是否TestFileTrigger.fileExistence属实。所以它的结果是无关紧要的。事实上,您在获得结果之前正在检查结果。
通过添加 a,Thread.Sleep您可以为 job1 提供足够的时间来完成并给出结果(job1 异步并发运行,很明显您希望它同步运行)。想象一下,例如,您告诉您的朋友 Fred 去商店买披萨并将其放在您的桌子上(异步),然后立即转身并想知道为什么您的桌子上没有披萨。
如果你自己去商店买了一个披萨,带回家放在你的桌子上,然后在你的桌子上吃披萨,那就是同步的。
JobScheduler.ScheduleJob(job1, trigger1);确实异步工作。
您应该创建一个作业来完成步骤 4 并安排其定期运行,或者您可以使用内置作业FileScanJob来代替。
| 归档时间: |
|
| 查看次数: |
1759 次 |
| 最近记录: |