Kevin Krumwiede Asked: 2024-11-26 00:42:49 +0800 CST2024-11-26 00:42:49 +0800 CST 2024-11-26 00:42:49 +0800 CST IHostedService/BackgroundService 的生命周期是什么? 772 StopAsync在上调用之后IHostedService,可以StartAsync在同一个实例上再次调用吗? 如果是这样,这意味着ExecuteAsync可以在同一个实例上调用多次BackgroundService。 asp.net-core 1 个回答 Voted Best Answer Ruikai Feng 2024-11-26T15:02:55+08:002024-11-26T15:02:55+08:00 在 IHostedService 上调用 StopAsync 后,是否可以在同一实例上再次调用 StartAsync? - 是的 一个最小的 Blazor 服务器示例: public class MyBackGroundService : IHostedService, IDisposable { private readonly ILogger<MyBackGroundService> _log; private Timer _timer; private int index { get; set; } public bool isRunning { get; set; }=false; public MyBackGroundService(ILogger<MyBackGroundService> log) { _log = log; index=new Random().Next(0,20); } public void Dispose() { _timer.Dispose(); } public Task StartAsync(CancellationToken cancellationToken) { isRunning=true; _timer = new Timer(Do, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { isRunning = false; _log.LogInformation($"{DateTime.Now} BackService{index} is Stopping"); _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } private void Do(object o) { _log.LogInformation($"Background Service{index} is working. {DateTime.Now}"); try { // dosometing } catch (Exception e) { _log.LogInformation("Error: {0}", e.Message); throw e; } } } 在program.cs中: builder.Services.AddSingleton<MyBackGroundService>(); builder.Services.AddHostedService<MyBackGroundService>(); 在剃须刀组件中: @inject MyBackGroundService backgroundservice; <PageTitle>Counter</PageTitle> <button @onclick="start">Start</button> <button @onclick="stop">Stop</button> @code { protected override void OnInitialized() { if (backgroundservice.isRunning) { backgroundservice.StopAsync(new System.Threading.CancellationToken()); } base.OnInitialized(); } public void start() { if (!backgroundservice.isRunning) { backgroundservice.StartAsync(new System.Threading.CancellationToken()); } } public void stop() { if (backgroundservice.isRunning) { backgroundservice.StopAsync(new System.Threading.CancellationToken()); } } } 注册为单例的可以多次启动和停止,使用AddHostedService方法注册的会在应用启动时启动,在应用关闭时停止 我点击按钮按照步骤:开始——停止——启动,控制台:
- 是的
一个最小的 Blazor 服务器示例:
在program.cs中:
在剃须刀组件中:
注册为单例的可以多次启动和停止,使用
AddHostedService
方法注册的会在应用启动时启动,在应用关闭时停止我点击按钮按照步骤:开始——停止——启动,控制台: