【发布时间】:2019-06-05 04:16:10
【问题描述】:
我正在开发一个 asp.net mvc core 2 应用程序。
我想在我的应用程序的后台运行一种 cron 任务,该任务每 10 分钟启动一次。 我已经编写了一个控制台应用程序来执行此操作,但我想知道是否有办法将此代码直接放入 asp.net mvc 核心项目(Startup.cs ?)
【问题讨论】:
标签: asp.net asp.net-core asp.net-core-mvc background-task
我正在开发一个 asp.net mvc core 2 应用程序。
我想在我的应用程序的后台运行一种 cron 任务,该任务每 10 分钟启动一次。 我已经编写了一个控制台应用程序来执行此操作,但我想知道是否有办法将此代码直接放入 asp.net mvc 核心项目(Startup.cs ?)
【问题讨论】:
标签: asp.net asp.net-core asp.net-core-mvc background-task
控制台应用程序应该是一样的。 asp.net 核心应用程序中有一个main 函数。也可以放在 StartUp.cs 中。
唯一的问题是,例如,如果您在 IIS 中托管您的应用程序。通常在有时没有传入请求之后,您的应用程序将进入睡眠模式(被杀死),您的后台任务也是如此。所以你需要仔细验证。
【讨论】:
在 ASP Core 中,您使用 IHostedService
见: Implement background tasks in microservices with IHostedService and the BackgroundService class
【讨论】:
向您的 Startup.cs 添加内容是一种可行的方法。
你可以这样实现你的工作:
public class YourCronService: IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
Task.Run(TaskRoutine, cancellationToken);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("Sync Task stopped");
return null;
}
public Task TaskRoutine()
{
while (true)
{
//Do what ever you want to do all 10 Minutes
//Wait 10 minutes till next execution
DateTime nextStop = DateTime.Now.AddMinutes(10);
var timeToWait = nextStop - DateTime.Now;
var millisToWait = timeToWait.TotalMilliseconds;
Thread.Sleep((int)millisToWait);
}
}
}
实现您的服务后,您只需将以下代码行添加到您的 Startup.cs 到 ConfigureServices 方法中:
services.AddSingleton<IHostedService, YourCronService>();
如果您这样做,您应该明确检查您的服务器是否“始终开启”。如果您的服务器处于待机模式,则不会执行该作业。 Auzure Web App 就是一个很好的例子。如果您的网络应用有一段时间未使用,它将设置为待机模式,直到下一次请求,除非您打开“始终开启”功能。
【讨论】:
我已经能够在 MVC Core 中使用 HangFire 做到这一点。
我添加了 Nuget 包: Hangfire.AspNetCode、HangFire.Console 和 HangFire.SqlServer
配置服务:
services.AddHangfire(x => x.UseSqlServerStorage(connectionForHangFire));
配置:
app.UseHangfireDashboard();
app.UseHangfireServer();
【讨论】: