由于换了工做也有两个多月没有写博客啦,由于跟着红超哥(大佬)一直在学习和作项目(反正就是在潜心修炼,大佬天天也是在我十万个为何中度过的。)html
// 相似于这样写 Task.Run(() => { Console.WriteLine("年轻人"); }).Start();
很快啊 很快,红超哥就眼神就不对了,完了,完了。当时我就知道红超哥又要教我了。果不其然红超哥和我说可使用BackgroundService也就是今天的主角。shell
当时我满脑子都在想一个剧情
红超哥:年轻人你这样写代码不优雅,可读性很差,你在这里练死劲没用。
我:有用! 特别有用
...... (后面我没用)ps:上剧情纯属玩笑异步
如今咱们要实现一个轮询需求,咱们须要怎么作呢?(此时此刻我想望向红超哥,可是我一我的出差了,因此只能本身实现了)async
public abstract class InitBackgroundWork : BackgroundService { //建立一个取消标记源 private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); //入参委托 private Action<object> action; //方法初始话 protected void Init() { action = async e => { while (true) { DoWork(e); await Task.Delay(TimeSpan.FromSeconds(10)); } }; } /// <summary> /// 执行方法 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override Task ExecuteAsync(CancellationToken stoppingToken) { Init(); _ = Task.Factory.StartNew(action, cancellationTokenSource.Token); return Task.CompletedTask; } /// <summary> /// 咱们重写一下关闭方法 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public override Task StopAsync(CancellationToken cancellationToken) { cancellationTokenSource.Cancel(); return base.StopAsync(cancellationToken); } //抛出方法入口 protected abstract void DoWork(object state); }
这样咱们只须要管入口方法就行了,建立一个类继承它,而后在配置服务中AddHostedService添加就行了,咱们也能够直接经过开始方法、结束方法控制就行了ide
public class GetGirlfriend: InitBackgroundWork { protected override void DoWork(object state) { Console.WriteLine("给我1个女友!!!!"); } }