Use Lazy to elegantly solve the asynchronous requirements in the constructor
Use Lazy<>to elegantly solve the asynchronous requirements in the constructor
Past life and present life
Thread safety
public class Singleton<T> where T : class, new() { public static T Instance = new Lazy<T>(() => new T()). Value; }
cause
public interface IQuartzJobService { /// <summary> ///Add Job /// </summary> void AddJob(IJobDetail jobDetail, ITrigger trigger); /// <summary> ///Pause all tasks /// </summary> Task PauseAll(); /// <summary> ///Resume all tasks /// </summary> Task ResumeAll(); /// <summary> ///Stop the specified task /// </summary> Task PauseJob(string key); /// <summary> ///Resume the specified task /// </summary> Task ResumeJob(string key); /// <summary> ///Suspend the specified task group /// </summary> Task PauseJobs(string group); /// <summary> ///Restore the specified task group /// </summary> Task ResumeJobs(string group); /// <summary> ///Stop scheduler /// </summary> Task Shutdown(); }
private readonly ILogger<QuartzJobService> _logger; private readonly IScheduler _scheduler; public QuartzJobService(ILogger<QuartzJobService> logger, ISchedulerFactory factory) { _logger = logger; // 1 //_scheduler = factory. GetScheduler(). Result; // 2 //Task. Run(async () => _scheduler = await factory. GetScheduler(). ConfigureAwait(false)); }
private readonly ILogger<QuartzJobService> _logger; private readonly Lazy<Task<IScheduler>> _scheduler; public QuartzJobService(ILogger<QuartzJobService> logger, ISchedulerFactory factory) { _logger = logger; _scheduler = new Lazy<Task<IScheduler>>(factory.GetScheduler()); //_scheduler = new Lazy<Task<IScheduler>>(async () => //{ // var scheduler = await factory.GetScheduler(); // return scheduler; //}); }
builder.Services.SetupQuartz(options => { var jobKey = JobKey.Create(nameof(SimpleJob)); options.AddJob<SimpleJob>(jobKey); options.AddTrigger(configure => { configure.ForJob(jobKey) .WithCronSchedule("0/3 * * * * ?") .StartNow(); }); jobKey = JobKey.Create(nameof(SimpleJob1)); options.AddJob<SimpleJob1>(jobKey); options.AddTrigger(configure => { configure.ForJob(jobKey) .WithCronSchedule("0/5 * * * * ?") .StartNow(); }); }); var app = builder.Build(); var quartz = app.Services.GetRequiredService<IQuartzJobService>(); quartz.PauseJob(nameof(SimpleJob)); quartz.ResumeJob(nameof(SimpleJob)); quartz.PauseJob(nameof(SimpleJob1)); quartz.ResumeJob(nameof(SimpleJob1)); //...... public async Task PauseJob(string key) { var scheduler = await _scheduler.Value; await scheduler.PauseJob(JobKey. Create(key)); } public async Task ResumeJob(string key) { var scheduler = await _scheduler.Value; await scheduler.ResumeJob(JobKey. Create(key)); }