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