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



我的asp.net核心程序需要收集所有访问网站的IP。

一天结束后,我需要将IP列表输出到一个txt文件中。

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

我应该如何设计它?

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

我应该这样做吗?非常感谢。

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

首先在您的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>();

最新更新