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

时间:2019-02-18 17:02:12

标签: c# async-await quartz.net

在下一个示例中,如果任务成功完成,如何获取信息: 应用程序每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;
        }

        }

这是好方法吗?

2 个答案:

答案 0 :(得分:1)

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

到目前为止,您还没有描述为什么要获取异常信息。

答案 1 :(得分:0)

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

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

Microsoft Docs - Task of T

示例:

Task<bool> myTask = Task.Run(() => { return true; } );
var success = myTask.Result; // warning: this is a blocking call