Как я могу заказать ядро ​​asp.net запускает метод один раз в день? - PullRequest
0 голосов
/ 24 октября 2019

Моей основной программе asp.net необходимо собрать все IP-адреса, которые имеют доступ к веб-сайту до дня.

Мне нужно вывести список IP-адресов в текстовый файл по окончании дня.

Поэтому программа должна запускать метод для сохранения списка IP-адресов один раз в день.

Как мне его создать?

По моему мнению, я добавлю задачу зацикливания вstartup.cs и установите Task.Delay на 24 часа (один день).

Должен ли я сделать это так? Спасибо.

1 Ответ

2 голосов
/ 24 октября 2019

Так я реализую задачу планировщика в ASP.Net Core. Обратите внимание, что вы должны знать, как использовать выражение cron.

Сначала добавьте этот пакет в свой csproj

<PackageReference Include="ncrontab" Version="3.3.1" />

Далее я создам SceduledProcessor.cs

public abstract class ScheduledProcessor : ScopedProcessor
    {
        private readonly CrontabSchedule _schedule;
        private DateTime _nextRun;

        protected ScheduledProcessor(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory)
        {
            _schedule = CrontabSchedule.Parse(GetCronExpression(serviceScopeFactory));
            _nextRun = _schedule.GetNextOccurrence(DateTime.Now);
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            do
            {
                var now = DateTime.Now;
                _schedule.GetNextOccurrence(now);

                if (now > _nextRun)
                {
                    await ProcessBackgroundTask();
                    _nextRun = _schedule.GetNextOccurrence(DateTime.Now);
                }

                await Task.Delay(5000, stoppingToken);
            }
            while (!stoppingToken.IsCancellationRequested);
        }

        protected abstract string GetCronExpression(IServiceScopeFactory serviceScopeFactory);
    }

ExecuteAsync будет запущен для нашего сценария

Обратите внимание, что мы должны реализовать метод GetCronExpression

Далее я реализую класс обслуживания

public class ScheduledEmailService : ScheduledProcessor
    {
        public ScheduledEmailService(
            IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory)
        {
        }

        /// <summary>
        /// Get cron setting from db
        /// </summary>
        /// <returns></returns>
        protected override string GetCronExpression(IServiceScopeFactory serviceScopeFactory)
        {
            return ""; // return your cron expression here you can get from db or static string
        }

        public override Task ProcessInScope(IServiceProvider serviceProvider)
        {
            // do something you wish
            return Task.CompletedTask;
        }
    }

Бонус здесь маленькийкласс с предопределенным значением для выражения cron вы можете использовать его

public static class CronExpression
    {
        public static readonly string EveryMinute = "0 * * * * *";
        public static readonly string EveryDay = "0 0 0 * * *";
        public static readonly string EveryWeek = "0 0 * * 0";
        public static readonly string EveryWeekend = "0 0 0 * * 6,0";
    }

Наконец добавьте это в свой Startup.cs

services.AddSingleton<IHostedService, ScheduledEmailService>();
...