web-dev-qa-db-fra.com

Comment démarrer HostedService dans l'application MVC Core sans demande http

Dans mon application MVC .NET core 2.2, il y a HostedService qui fait un travail de fond.

Il est enregistré dans la méthode ConfigureServices de la classe Startap

services.AddHostedService<Engines.KontolerTimer>();

Comme il s'agit d'un service d'arrière-plan indépendant des demandes des utilisateurs, je veux démarrer mon service d'arrière-plan immédiatement au démarrage de l'application. C'est maintenant le cas pour mon HostedService qui regarde après la première demande de l'utilisateur.

Quelle est la bonne façon de démarrer HostedService au démarrage de l'application MVC Core

Mon service ressemble à celui-ci https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/Host/hosted-services?view=aspnetcore-2.2

internal class TimedHostedService : IHostedService, IDisposable
{
    private readonly ILogger _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is starting.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        _logger.LogInformation("Timed Background Service is working.");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

On dirait que j'ai du mal à regarder l'application du tout.

Mon porgram cs ressemble

public class Program
    {
        public static void Main(string[] args)
        {
           CreateWebHostBuilder(args).Build().Run();


        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
            .UseStartup<Startup>();
    }

Et je ne frappe aucun point d'arrêt avant la première demande de l'utilisateur. Suis-je manquer quelque chose, c'est l'application .Net Core par défaut créée par VS2017

Voici mon starup.cs

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        private Models.Configuration.SerialPortConfiguration serialPortConfiguration;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
                .AddDefaultUI(UIFramework.Bootstrap4)
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            services.AddDbContext<Data.Parking.parkingContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));


         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddHostedService<Engines.KontolerTimer>();}
12
adopilot

Si vous voulez avoir un service effectuant des tâches en arrière-plan (similaire aux anciens services Windows), je vous suggère d'utiliser: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/Host/ generic-host? view = aspnetcore-2.2 au lieu d'un WebHost.

WebHost ajoute beaucoup de choses dont vous n'aurez probablement pas besoin car cela semble être un travail d'arrière-plan simple (en supposant que lire votre code).

0
gatsby