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:
-
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."); } }
-
Register
IHostedService
services.AddSingleton<IHostedService, RecureHostedService>();
-
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(); } }