как сделать фоновый рабочий для обновления хранилища данных каждые 5 минут в ядре asp.net - PullRequest
0 голосов
/ 16 ноября 2018

Я следовал руководству по началу работы и в настоящее время у меня есть приложение TODO CRUD.

https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api-mac?view=aspnetcore-2.1

Я хочу добавить фонового работника, который обновляет базу данных задач каждые 5 минут иустанавливает для элемента 1 случайное значение для его имени и свойства isCompleted.

Это довольно просто в Java SpringBoot или Elixir's Phoenix ... Существует ли быстрый и безболезненный способ сделать это в c #?

Документ, который я нашел на веб-сайте Microsoft, был с 2012 года ... поэтому я предполагаю, что к настоящему времени есть более элегантный способ сделать это.

Редактировать: я пошел с DNTScheduler.Core, и это было относительно безболезненноустановить.Следовал примеру exampleApp, который был на github repo, и вот задача, которую я в итоге использовал:

using System;
using System.Threading.Tasks;
using DNTScheduler.Core.Contracts;
using Microsoft.Extensions.Logging;
using myapp.Models;

namespace MyApp.Tasks
{
    public class TaskOne : IScheduledTask
    {
        private readonly ILogger<DoBackupTask> _logger;
        private readonly TodoContext _context; // autoinjects since it was added in startup.cs in configure()

        public TaskOne(ILogger<DoBackupTask> logger, TodoContext context)
        {
            _logger = logger;
            _context = context;
        }

        public Task RunAsync()
        {

            var todo = _context.TodoItems.Find(1);
            if (todo == null)
            {
                return Task.CompletedTask;
            }

            string[] names = new string[] { "val1", "val2"};
            Random r = new Random();
            string random_name = names[r.Next(0, names.Length)];
            todo.Name = random_name;

            _context.TodoItems.Update(todo);
            _context.SaveChanges();
            _logger.LogInformation("Ran My Task\n\n ");

            return Task.CompletedTask;

        }
    }
}

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Я бы сказал, что правильный ответ неверен, если вы хотите следовать нативной практике.

Используйте IHostedService для выполнения повторяющихся действий.

Вот ответ Я написал, что адрес это.

0 голосов
/ 19 ноября 2018

Есть высказывание, которое я где-то читал: «Если это стоит делать, то стоит делать правильно. Если не стоит делать правильно - найди что-нибудь, что есть».

Итак, как уже говорили другие коллеги, веб-приложение не должно быть контейнером для фоновых процессов по причинам, уже упомянутым.

В зависимости от вашей среды, вам будет гораздо лучше использовать:

  1. службы Windows или даже планировщик Windows (на классическом хостинге) или некоторые библиотеки для планирования, но за пределами веб-приложения. затем этот планировщик, в зависимости от того, что он есть, может просто запускать конечную точку API в вашем веб-приложении, чтобы вы могли иметь бизнес-логику в одном месте
  2. Azure Scheduler, если вы работаете с Azure

почти все остальные ищут проблемы, когда они вам не нужны.

0 голосов
/ 17 ноября 2018

Я бы посоветовал вам использовать планировщик, есть несколько пакетов, которые могут это сделать, но лучший пакет, который я видел до сих пор, это DNTScheduler.Core

DNTScheduler.Core - это облегченный бегунок и планировщик фоновых задач ASP.NET Core.

для получения дополнительной информации вы можете посетить эту ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...