[英]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.