#c# #asp.net-core #automation
#c# #asp.net-core #автоматизация
Вопрос:
Я уверен, что есть подходящий термин для того, что я пытаюсь сделать, но я этого не знаю. Я хотел бы периодически «запускать» программу или метод в контроллере API. Например, в базе данных, подключенной к моему приложению, у меня есть таблица A, которая заполняется по запросу клиента, и таблица B, которая использует таблицу A для заполнения самой себя. Таблица B не должна заполняться во время запроса клиента, потому что это заняло бы слишком много времени, вместо этого было бы удобно, чтобы существовала программа, которая ссылается на таблицу A и периодически заполняет таблицу B.
Как называется эта практика? Как это делается в C # / ASP.NET Core и каковы некоторые рекомендации? К вашему сведению, мой ASP.NET Основной REST API развернут в Azure.
Спасибо вам и будьте в безопасности!
Комментарии:
1. Вы видели документацию Microsoft по HostedServices? Это может быть хорошим началом: learn.microsoft.com/en-us/aspnet/core/fundamentals/host /…
Ответ №1:
В ASP.NET Ядро вы можете запускать фоновые задачи, создав размещенный сервис. Вы можете прочитать полную документацию здесь.
Если вы хотите периодически запускать задачу, может подойти фоновая задача по времени. Пример, взятый непосредственно из документации, является:
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
не будет ждать завершения вашей длительной задачи, поэтому, возможно, лучше сначала остановить таймер, а затем возобновить его.
Не забудьте зарегистрировать фоновую задачу в ConfigureServices
методе вашего Startup
класса:
services.AddHostedService<TimedHostedService>();
Ответ №2:
С архитектурной точки зрения я бы посоветовал вам разделить такие тяжелые вычисления на другие микросервисы или использовать текущие бессерверные возможности в большинстве облачных предложений.
Если это невозможно, asp.net в ядре есть так называемые «фоновые службы», которые вы можете использовать для запуска определенных задач. Вот документ: Фоновые задачи с размещенными службами в ASP.NET Ядро. Он также доступен в версии 2.1.