繁体   English   中英

Asp.Net 核心长时间运行/后台任务

[英]Asp.Net core long running/background task

以下是在 Asp.Net Core 中实现长时间运行的后台工作的正确模式吗? 或者我应该使用某种形式的Task.Run / TaskFactory.StartNewTaskCreationOptions.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM