例如,我想做这样的事情:
(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); }
但似乎Job2永远不会开始.
Testemail和TestFileTrigger此时只需打印到控制台.布尔值TestFileTrigger.fileExistence来自检查文件是否存在于给定位置(它确实存在).
编辑:
TestFileTrigger.fileExistence是一个布尔值.如果有帮助,添加了Job1 / Job2的定义.
编辑:
我发现如果我把Thread.Sleep(TimeSpan.FromSeconds(x));在if语句之前,if语句将在满足条件时运行. (其中x是一些秒数.)为什么它在这种情况下有效,但不是这样?我不能总是知道要满足条件需要多少秒.
解决方法
问题如下.
您的主要线程执行以下操作.
>创建两个作业
>给每个工作一个触发器
>安排Job1开始
>检查TestFileTrigger.fileExistence,如果为true,则启动Job2(它为false,因此不运行).
然后线程池线程将启动Job1.最有可能设置TestFileTrigger.fileExistence = true.但是主线程已经完成了它的工作.
鳍.
在任何时候你都不回去检查TestFileTrigger.fileExistence是否为真.所以它的结果无关紧要.事实上,在得到结果之前,您正在检查结果.
通过添加一个Thread.Sleep,你可以给job1足够的时间来完成并给你一个结果(job1以异步和并发的方式运行,很明显你希望它能同步运行).想象一下,例如你告诉你的朋友弗雷德去商店购买比萨饼并把它放在你的桌子上(异步),然后马上转过身来,想知道为什么你的桌子上没有披萨.
同步将是你自己去商店,买了一个披萨,把它带回家把它放在你的桌子上,然后从你的桌子上吃披萨.
JobScheduler.ScheduleJob(job1,trigger1);确实是异步工作的.
您应该创建一个作业来包装第4步并安排定期运行,或者使用内置的FileScanJob代替.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。