Quartz.NET如何在任务失败或成功时获得结果

问题描述 投票:0回答:2

如果在下一个示例中成功完成任务,如何获取信息:应用程序每5秒创建1到10之间的随机数。如果数字是5则返回true,否则为false。这是我到目前为止所做的:

        public static async void Operate()
        {
            CreateScheduler();

            IJobDetail job = JobBuilder.Create<MyFirstJob>()
                .WithIdentity("myJob", "group1")
                .Build();


            // Trigger the job to run now, and then every 5 seconds
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("myTrigger", "group1")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(5)
                    .RepeatForever())
            .Build();

            await _scheduler.ScheduleJob(job, trigger);

        }

 class MyFirstJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            bool retVal = false;

            var myTask = new Task(() =>
            {
                try
                {
                    Random rnd = new Random();
                    int num = rnd.Next(1, 11);

                    Console.WriteLine("Generated num:" + num);

                    if (num != 5)
                    { 
                        if (context.RefireCount < 6)
                        {                         
                            Console.WriteLine("Failed!");
                            throw new NotImplementedException();
                        }
                    } 

                    Console.WriteLine("OK");
                    retVal = true;


                }
                catch (Exception ex)
                {

                }
            });


            myTask.Start();
            return myTask;
        }

        }

这是好方法吗?

c# async-await quartz.net
2个回答
1
投票

您可能想要考虑Quartz.NET的内置功能。通常,您不应该从作业开始新任务,它们是任务。考虑用常规的惯用任务构造编写逻辑,比如等待等,然后添加单独的侦听器来检查问题。 Quartz.NET本身根据您的配置重试异常作业。

到目前为止,您尚未描述为什么需要异常信息。


0
投票

对于常规Task对象,您可以依赖包装的异常来确定失败。

或者,您可以返回Task<T>对象以存储您选择的类型返回值。

Microsoft Docs - Task of T

例:

Task<bool> myTask = Task.Run(() => { return true; } );
var success = myTask.Result; // warning: this is a blocking call
© www.soinside.com 2019 - 2024. All rights reserved.