如果在下一个示例中成功完成任务,如何获取信息:应用程序每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;
}
}
这是好方法吗?
您可能想要考虑Quartz.NET的内置功能。通常,您不应该从作业开始新任务,它们是任务。考虑用常规的惯用任务构造编写逻辑,比如等待等,然后添加单独的侦听器来检查问题。 Quartz.NET本身根据您的配置重试异常作业。
到目前为止,您尚未描述为什么需要异常信息。
对于常规Task
对象,您可以依赖包装的异常来确定失败。
或者,您可以返回Task<T>
对象以存储您选择的类型返回值。
例:
Task<bool> myTask = Task.Run(() => { return true; } );
var success = myTask.Result; // warning: this is a blocking call