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

后端 未结 2 1893
有刺的猬
有刺的猬 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<V2rayFlowBackService> 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<BackService>();
            services.AddHostedService(sp => sp.GetRequiredService<BackService>());
        }
    

    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
    <h1>Hello, world!</h1>
    
    Welcome to your new app.
    
    <button @onclick="on">Start</button>
    <button @onclick="off">Stop</button>
    

    reference

    0 讨论(0)
  • 2020-12-13 20:03

    For StopAsync(CancellationToken token), you could pass new System.Threading.CancellationToken(). In the defination of public CancellationToken(bool canceled), canceled indicates state for the token. For your scenario, there is no need to specify the canceled since you want to Stop the service.

    You could follow below step by step:

    1. Create IHostedService

         public class RecureHostedService : IHostedService, IDisposable
       {
      private readonly ILogger _log;
      private Timer _timer;
      public RecureHostedService(ILogger<RecureHostedService> log)
      {
          _log = log;
      }
      
      public void Dispose()
      {
          _timer.Dispose();
      }
      
      public Task StartAsync(CancellationToken cancellationToken)
      {
          _log.LogInformation("RecureHostedService is Starting");
          _timer = new Timer(DoWork,null,TimeSpan.Zero, TimeSpan.FromSeconds(5));
          return Task.CompletedTask;
      }
      
      public Task StopAsync(CancellationToken cancellationToken)
      {
          _log.LogInformation("RecureHostedService is Stopping");
          _timer?.Change(Timeout.Infinite, 0);
          return Task.CompletedTask;
      }
      private void DoWork(object state)
      {
          _log.LogInformation("Timed Background Service is working.");
      }
      }
      
    2. Register IHostedService

          services.AddSingleton<IHostedService, RecureHostedService>();
      
    3. Start and Stop Service

       public class HomeController : Controller {
       private readonly RecureHostedService _recureHostedService;
       public HomeController(IHostedService hostedService)
       {
           _recureHostedService = hostedService as RecureHostedService;
       }
       public IActionResult About()
       {
           ViewData["Message"] = "Your application description page.";
           _recureHostedService.StopAsync(new System.Threading.CancellationToken());
           return View();
       }
      
       public IActionResult Contact()
       {
           ViewData["Message"] = "Your contact page.";
           _recureHostedService.StartAsync(new System.Threading.CancellationToken());
           return View();
       } }
      
    0 讨论(0)
提交回复
热议问题