c# - QUARTZ.NET 未执行进程
问题描述
我正在使用最新3.0.6
版本的 Quartz.net 我想安排一个进程每天运行一次(目前在示例中它是每 40 秒,但我会改变它)我有调用它执行的方法,但它似乎没有开始我应该在“工作”类中启动它的任何过程。我不确定为什么它不触发?
public static void Run()
{
var isRunning = false;
IServiceCollection services = new ServiceCollection();
Startup startup = new Startup();
var serviceProvider = startup.ConfigureServices(services);
IWindsorContainer _container = serviceProvider.GetService<IWindsorContainer>();
while (true)
{
if (!isRunning)
{
isRunning = true;
var configuration = _container.Resolve<IConfigurationRoot>();
var _process = _container.Resolve<Process.Process>();
int secondsForSleep = Convert.ToUInt16(configuration[Enums.SleepTime]);
{
try
{
execute();
}
catch (Exception ex)
{
}
finally
{
isRunning = false;
Thread.Sleep(secondsForSleep);
_container.Release(_process);
}
}
}
}
}
public static async void execute()
{
// construct a scheduler factory
NameValueCollection props = new NameValueCollection
{
{ "quartz.serializer.type", "binary" }
};
StdSchedulerFactory factory = new StdSchedulerFactory(props);
// get a scheduler
IScheduler sched = await factory.GetScheduler();
await sched.Start();
IJobDetail job = JobBuilder.Create<Job>()
.WithIdentity("myJob", "group1")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(1)
.RepeatForever())
.Build();
await sched.ScheduleJob(job, trigger);
}
}
public class Job : IJob
{
public async Task Execute(IJobExecutionContext context)
{
JobKey key = context.JobDetail.Key;
IServiceCollection services = new ServiceCollection();
Startup startup = new Startup();
var serviceProvider = startup.ConfigureServices(services);
IWindsorContainer _container = serviceProvider.GetService<IWindsorContainer>();
var configuration = _container.Resolve<IConfigurationRoot>();
var _process = _container.Resolve<Process.Process>();
Task t = new Task(() =>
{
_process.MainProcess();
});
t.Start();
await t;
}
}
我是否错误地设置IJobDetail
了对象或其他东西?有没有人有类似的问题?好像我根据文档做了一切,但我仍然无法让它工作
解决方案
这不是您问题的直接答案,但如果问题与以下相关,可能会对您有所帮助。
看,您已将execute
方法定义为async void
. 结果,您不能通过await execute()
等调用它
- 您的块将不会处理方法
try-catch
中引发的任何异常execute
finally
块在调用execute()
方法后直接运行(不等待方法完成)
换句话说,将您的代码更改为async Task execute()
andawait execute()
并再次测试它。
有关更多理论,我建议您阅读以下内容:async/await - when to return a Task vs void? 和msdn:Async/Await - 最佳实践
推荐阅读
- math - 查找给定(sympy)行列表的中心线
- php - 如何插入多选的新值
- android - 生成 APK 构建时出错并尝试从设备即时应用程序运行它
- elasticsearch - 在elasticsearch中加入文档
- python - 从 FTP 服务器到 Flask 服务器的 Python 流以供下载
- spring - 如何处理 Spring reactor Mono 或 Flux 中的错误?
- objective-c - 从数组中调用元素并将其分配给变量?
- python - 加入两个具有多个值的 Rdd 并基于加入 Pyspark 添加额外的值?
- python - 使用子进程在 python 中发送电子邮件
- pycharm - PyCharme IDE 问题