Cron 表达式:在 ASP.Net Core 中每天运行一次任务

Mel*_* NG 1 c# cron asp.net-core-mvc .net-core asp.net-core

我的asp.net core程序需要收集前一天访问网站的所有IP。

当一天结束时,我需要将 IP 列表输出到 txt 文件。

因此,程序应该每天运行一次保存 IP 列表的方法。

我应该如何设计它?

在我看来,我会在 中添加一个循环任务startup.cs,并将 设为Task.Delay24 小时(一天)。

我应该这样做吗?谢谢。

Ton*_*Ngo 5

这就是我在 ASP.Net Core 中实现调度程序任务的方法。请注意,您必须知道如何使用 cron epxression。

首先将此包添加到您的csproj中

<PackageReference Include="ncrontab" Version="3.3.1" />
Run Code Online (Sandbox Code Playgroud)

接下来我将创建 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);
    }
Run Code Online (Sandbox Code Playgroud)

将为我们的场景运行 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里的奖励是我的小类,带有 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";
    }
Run Code Online (Sandbox Code Playgroud)

最后将其添加到您的 Startup.cs

services.AddSingleton<IHostedService, ScheduledEmailService>();
Run Code Online (Sandbox Code Playgroud)