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 中。
谢谢您,并注意安全!
在 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)
从架构上来说,我建议您将这些繁重的计算分离到其他微服务中,或者利用大多数云产品中当前的无服务器功能。
如果这不可行,asp.net core 有一种称为“后台服务”的东西,您可以利用它来触发某些任务。这是文档: ASP.NET Core 中托管服务的后台任务。2.1 中也提供了该功能。
| 归档时间: |
|
| 查看次数: |
3043 次 |
| 最近记录: |