Worker Service in dotnet lets you create a long-running service in a CMD environment by using BackgroundService, which is an implementation of IHostedService. Rather than that it provinces the capability to run it as a windows service. In order to do that create a ServiceWorker project in visual studio and install the following package:
dotnet add package Microsoft.Extensions.Hosting.WindowsServices --version 7.0.0
Now modify the default program class to use windows service:
using WorkerService1; IHost host = Host.CreateDefaultBuilder(args) .UseWindowsService(options => { options.ServiceName = "My Windows Service"; }) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .Build(); await host.RunAsync();
The worker is the default background service of the Service Worker in vs template with the following definition:
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
We just added UseWindowsService() with a given name. That’s it about the required code to run in windows service. For publishing the worker service, you need to
- Set the configuration as Release/ Any CPU
- Set the Deployment as self contained (recommended)
- Set the target runtime based on your target machine (for me it’s a windows server)
You can check the Product Single File and Enable ReadyToRun compilation as true to make only a single file as .exe
After transferring the file to the target machine, if its windows you can run the following command to create a windows service:
sc.exe create "My Service" binpath="C:\service\MyService.exe"
Now you can refer to the services of your windows machine and run the service manually.