[英]Asp.Net core long running/background task
以下是在 Asp.Net Core 中实现长时间运行的后台工作的正确模式吗? 或者我应该使用某种形式的Task.Run
/ TaskFactory.StartNew
和TaskCreationOptions.LongRunning
选项?
public void Configure(IApplicationLifetime lifetime)
{
lifetime.ApplicationStarted.Register(() =>
{
// not awaiting the 'promise task' here
var t = DoWorkAsync(lifetime.ApplicationStopping);
lifetime.ApplicationStopped.Register(() =>
{
try
{
// give extra time to complete before shutting down
t.Wait(TimeSpan.FromSeconds(10));
}
catch (Exception)
{
// ignore
}
});
});
}
async Task DoWorkAsync(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
await // async method
}
}
另请检查 .NET Core 2.0 IHostedService
。 这是文档。 从 .NET Core 2.1 开始,我们将拥有BackgroundService
抽象类。 它可以像这样使用:
public class UpdateBackgroundService: BackgroundService
{
private readonly DbContext _context;
public UpdateTranslatesBackgroundService(DbContext context)
{
this._context= context;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await ...
}
}
在您的启动中,您只需要注册类:
public static IServiceProvider Build(IServiceCollection services)
{
//.....
services.AddSingleton<IHostedService, UpdateBackgroundService>();
services.AddTransient<IHostedService, UpdateBackgroundService>(); //For run at startup and die.
//.....
}
以下是在 Asp.Net Core 中实现长时间运行的后台工作的正确模式吗?
是的,这是在 ASP.NET Core 上开始长时间运行工作的基本方法。 您当然不应该使用Task.Run
/ StartNew
/ LongRunning
- 这种方法一直是错误的。
请注意,您长时间运行的工作可能会随时关闭,这很正常。 如果您需要更可靠的解决方案,那么您应该在 ASP.NET 之外拥有一个单独的后台系统(例如,Azure 函数/AWS lambdas)。 还有像 Hangfire 这样的库可以为您提供一些可靠性,但也有自己的缺点。
更新:我写了一个关于如何实现更可靠方法的博客系列,使用具有单独后台系统的持久队列。 根据我的经验,大多数开发人员需要更可靠的方法,因为他们不希望长时间运行的工作丢失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.