open System open System.Threading.Tasks open Microsoft.Extensions.DependencyInjection open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging type Worker(logger : ILogger) = inherit BackgroundService() let _logger = logger override bs.ExecuteAsync stoppingToken = let f : Async = async { while not stoppingToken.IsCancellationRequested do _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now) do! Async.Sleep(1000) } // ExecuteAsync needs to return a task, hence up-cast from Task to plain Task. // pass stoppingToken into async launch so that it's passed down automatically to other async CE's // per https://medium.com/@eulerfx/f-async-guide-eb3c8a2d180a Async.StartAsTask (computation = f, cancellationToken = stoppingToken) :> Task let CreateHostBuilder argv : IHostBuilder = let builder = Host.CreateDefaultBuilder(argv) builder .UseWindowsService() .ConfigureServices(fun hostContext services -> services.AddHostedService() |> ignore) [] let main argv = let hostBuilder = CreateHostBuilder argv hostBuilder.Build().Run() 0 // return an integer exit code