ASP.NET Core IHostedService manual start/stop/pause(?)

后端 未结 2 1903
有刺的猬
有刺的猬 2020-12-13 19:21

I would like to implement a recurring (timed) IHostedService instance in ASPNET Core that can be stopped and started on demand. My understanding is that IHostedService(s) a

2条回答
  •  感动是毒
    2020-12-13 19:52

    Using Blazor Server, you can start and stop background services in the following ways. Asp.net Core MVC or Razor is the same principle

    First, implement an IHostService

    public class BackService : IHostedService, IDisposable
    {
        private readonly ILogger _log;
        private Timer _timer;
        public bool isRunning { get; set; }
        public BackService(ILogger log)
        {
            _log = log;
        }
    
        public void Dispose()
        {
            _timer.Dispose();
        }
    
        public Task StartAsync(CancellationToken cancellationToken)
        {
            _log.LogInformation($"begin {DateTime.Now}");
            _timer = new Timer(DoWorkAsync, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
            return Task.CompletedTask;
        }
    
        public Task StopAsync(CancellationToken cancellationToken)
        {
            isRunning = false;
            _log.LogInformation($"{DateTime.Now} BackService is Stopping");
            _timer?.Change(Timeout.Infinite, 0);
            return Task.CompletedTask;
        }
        private void DoWorkAsync(object state)
        {
            _log.LogInformation($"Timed Background Service is working.  {DateTime.Now}");
            try
            {
                isRunning = true;
                // dosometing you want
            }
            catch (Exception ex)
            {
                isRunning = false;
                _log.LogInformation("Error {0}", ex.Message);
                throw ex;
    
            }
        }
    }
    

    Registration Service In Startup.cs

    public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton();
            services.AddHostedService(sp => sp.GetRequiredService());
        }
    

    Inject background services into Blazor components

    public class IndexBase:ComponentBase
    {
        [Inject]
        BackService BackService { set; get; }
    
        protected override void OnInitialized()
        {
            if (BackService.isRunning)
            {
                BackService.StopAsync(new System.Threading.CancellationToken());
            }
            base.OnInitialized();
        }
        public void on()
        {
            if (!BackService.isRunning)
            {
                BackService.StartAsync(new System.Threading.CancellationToken());
            }
    
        }
        public void off()
        {
            if (BackService.isRunning)
            {
                BackService.StopAsync(new System.Threading.CancellationToken());
            }
    
        }
    }
    
    @page "/"
    @inherits IndexBase
    

    Hello, world!

    Welcome to your new app.

    reference

提交回复
热议问题