繁体   English   中英

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

[英]C# ASP.NET Core - run code periodically/automatically in a deployed web app/API

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

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

谢谢你,并在那里保持安全!

在 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();
    }
}

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

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

services.AddHostedService<TimedHostedService>();

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

如果这不可行,asp.net core 有一个叫做“后台服务”的东西,你可以利用它来触发某些任务。 这是文档: 在 ASP.NET Core 中使用托管服务的后台任务 它也可以在 2.1 中使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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