1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/qinyongcheng-NetCoreFast

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Quartz.md 5.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 01:35 40a9520

Кварцевый таймер

Кварцевый таймер помогает классу Web.Util.QuartzHelper.cs. Есть два способа использования таймера: в качестве сервиса и не как сервис.

1. Использование таймера в качестве сервиса, то есть непрерывное выполнение задач в фоновом режиме

В каталоге Web/Controllers/Job добавьте класс службы таймера (можно также добавить в другой каталог)

/// <summary>
/// Класс службы таймера DisallowConcurrentExecution, это свойство может предотвратить одновременное выполнение заданий Quartz.NET
/// </summary>
[DisallowConcurrentExecution]
public class TimerDemo1Job : IJob, IJobProvider
{
    private List<JobSchedule> jobs = new List<JobSchedule>();  
	//Шаг 2: система вызывает этот метод для получения списка задач
    public List<JobSchedule> Jobs()
    {
        return jobs;
    }
	//Первый шаг: система вызывает этот метод для инициализации списка задач
    public void Init()
    {  
		var obj={From_time=время начала,……}
        //время начала
        var start_time = obj.From_time - new TimeSpan(0, 20, 0);
        var start_h = start_time.Hours;
        var start_m = start_time.Minutes;
        var cron = $"0 {start_m} {start_h} * * ?";
        //время окончания
        //var end_time = obj.From_time + new TimeSpan(0, 10, 0);          
		//Передача данных в задачу выполнения
        Dictionary<string, object> data = new Dictionary<string, object>();
        data.Add("expire", 30 * 60);
		data.Add("taskName", "Задача тестирования 1");
        //NLogHelper.logger.Info($"Публикация задачи таймера: начало{start_h}:{start_m}, выражение cron:{cron}");
        Console.WriteLine($"Публикация задачи таймера: начало{start_h}:{start_m}, выражение cron:{cron}");
		//Добавить в список задач
        this.jobs.Add(new JobSchedule(name: "TimerDemo1Job", jobType: typeof(TimerDemo1Job), cronExpression: cron, data: data));                        
    }
    //Можно разместить другие бизнес-объекты
    //public IStudentBll bll { get; set; }
	//public IClassScheduleBll classScheduleBll { get; set; }
    public IClaimsAccessor MyUser { get; set; }
	//Третий шаг: система вызывает этот метод для выполнения задачи таймера (метод обратного вызова)
    public Task Execute(IJobExecutionContext context)
    {
        return Task.Run(() =>
        {      
			//Получить данные data, переданные в исходную задачу через context.JobDetail.JobDataMap
            var expire = context.JobDetail.JobDataMap.GetInt("expire");
			var taskName = context.JobDetail.JobDataMap.GetString("taskName");
            //var classSchedules = classScheduleBll.SelectAll(o => o.TimeTableSn == timetable_sn && o.Date == DateTime.Now.Date);
            Console.WriteLine($"Выполнение запуска задачи таймера:" +taskName);                  
        });
    }
}

2. Использование таймера не как сервиса, то есть выполнение задачи только один раз по расписанию

//время начала
var start_time = obj.From_time - new TimeSpan(0, offset, 0);
var start_h = start_time.Hours;
var start_m = start_time.Minutes;
var cors = $"1 {start_m} {start_h} * * ?";
//Передача данных в задачу выполнения
Dictionary<string, object> data = new Dictionary<string, object>();
data.Add("expire", during * 60);
data.Add("taskName", "Задача тестирования 2");
//NLogHelper.logger.Info($"Опубликовать задачу таймера: начать{start_h}:{start_m}, cors:{cors}");
Console.WriteLine($"Опубликовать задачу таймера: начать{start_h}:{start_m}, cors:{cors}");
//Добавить задачу, которая будет выполнена в определённый момент времени
QuartzHelper.AddAt(typeof(StartTimerClockJob), new JobKey($"TimerClock{obj.Sn}", "TimerClock"), cors, data);


//Класс задачи таймера
[DisallowConcurrentExecution]
public class StartTimerClockJob : IJob
{           
    public Task Execute(IJobExecutionContext context)
    {
        return Task.Run(() =>
        {               
            var expire = context.JobDetail.JobDataMap.GetInt("expire");
			var taskName = context.JobDetail.JobDataMap.GetString("taskName");
            Console.WriteLine($"Выполнить запуск задачи таймера:" +taskName);      
        });
    }
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/qinyongcheng-NetCoreFast.git
git@api.gitlife.ru:oschina-mirror/qinyongcheng-NetCoreFast.git
oschina-mirror
qinyongcheng-NetCoreFast
qinyongcheng-NetCoreFast
NET8