using Microsoft.Extensions.Hosting; using Nirvana.Common; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace YBDevice.Api { /// /// 后台任务 /// public class BackManagerService : BackgroundService { BackManagerOptions options = new BackManagerOptions(); public BackManagerService(Action options) { options.Invoke(this.options); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { if (Configs.GetBoolValue("IsTask")) { // 延迟启动 await Task.Delay(this.options.CheckTime, stoppingToken); options.OnHandler(0, $"正在启动托管服务 [{this.options.Name}]...."); stoppingToken.Register(() => { options.OnHandler(1, $"托管服务 [{this.options.Name}] 已经停止"); }); while (!stoppingToken.IsCancellationRequested) { try { options?.Callback(); } catch (Exception ex) { options.OnHandler(2, $" [{this.options.Name}] 执行托管服务出错", ex); } await Task.Delay(this.options.CheckTime, stoppingToken); } } } public override Task StopAsync(CancellationToken cancellationToken) { options.OnHandler(3, $" [{this.options.Name}] 由于进程退出,正在执行清理工作"); return base.StopAsync(cancellationToken); } } public class BackManagerOptions { /// /// 任务名称 /// public string Name { get; set; } /// /// 获取或者设置检查时间间隔,单位:毫秒,默认 5 秒 /// public int CheckTime { get; set; } = 5 * 1000; /// /// 回调委托 /// public Action Callback { get; set; } /// /// 执行细节传递委托 /// public Action Handler { get; set; } /// /// 传递内部信息到外部组件中,以方便处理扩展业务 /// /// 0=Info,1=Debug,2=Error,3=exit /// /// /// public void OnHandler(int level, string message, Exception ex = null, object state = null) { Handler?.Invoke(new BackHandler() { Level = level, Message = message, Exception = ex, State = state }); } } public class BackHandler { /// /// 0=Info,1=Debug,2=Error /// public int Level { get; set; } public string Message { get; set; } public Exception Exception { get; set; } public object State { get; set; } } }