C# ASP.NET Core - 在已部署的 Web 应用程序/API 中定期/自动运行代码

use*_*917 5 c# automation asp.net-core

我确信有一个合适的术语来描述我正在尝试做的事情,但我不知道。我想定期“运行”API 控制器中的程序或方法。例如,在连接到我的应用程序的数据库中,我有根据客户端请求填充的表 A,以及使用表 A 填充自身的表 B。表 B 不应在客户端请求期间填充,因为这会花费太长时间,相反,存在一个引用表 A 并定期填充表 B 的程序会很方便。

这种做法叫什么?在 C#/ASP.NET Core 中是如何完成的?有哪些最佳实践?仅供参考,我的 ASP.NET Core REST API 部署在 Azure 中。

谢谢您,并注意安全!

And*_*aal 8

在 ASP.NET Core 中,您可以通过创建托管服务来运行后台任务。您可以在此处阅读完整的文档。

如果您想定期运行任务,那么定时后台任务可能比较合适。直接取自文档的示例是:

public class TimedHostedService : IHostedService, IDisposable
{
    private int executionCount = 0;
    private readonly ILogger<TimedHostedService> _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service running.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        var count = Interlocked.Increment(ref executionCount);

        _logger.LogInformation(
            "Timed Hosted Service is working. Count: {Count}", count);
    }

    public Task StopAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

在该方法中执行长时间运行的任务DoWork。另请注意,它表示Timer不会等待长时间运行的任务完成,因此最好先停止计时器,然后再恢复。

ConfigureServices不要忘记在类的方法中注册后台任务Startup

services.AddHostedService<TimedHostedService>();
Run Code Online (Sandbox Code Playgroud)


sid*_*cus 0

从架构上来说,我建议您将这些繁重的计算分离到其他微服务中,或者利用大多数云产品中当前的无服务器功能。

如果这不可行,asp.net core 有一种称为“后台服务”的东西,您可以利用它来触发某些任务。这是文档: ASP.NET Core 中托管服务的后台任务。2.1 中也提供了该功能。