BackgroundService 大佬教的好

BackgroundService 源码分析

由于换了工做也有两个多月没有写博客啦,由于跟着红超哥(大佬)一直在学习和作项目(反正就是在潜心修炼,大佬天天也是在我十万个为何中度过的。)html

  • 最近在作一个接收服务端信息的项目,使用TCP创建链接,双方进行信息通讯。后面我会陆陆续续的把本身学习的东西进行一个是输出。
  • 当时有一个需求须要在程序初始化完毕以后,执行一些不干扰主要流程的代码 (说时猛,那时快,聪明的我立刻想到了新起一个线程去执行)。
// 相似于这样写
    Task.Run(() =>
    {
        Console.WriteLine("年轻人");
      }).Start();

很快啊 很快,红超哥就眼神就不对了,完了,完了。当时我就知道红超哥又要教我了。果不其然红超哥和我说可使用BackgroundService也就是今天的主角。shell

当时我满脑子都在想一个剧情
红超哥:年轻人你这样写代码不优雅,可读性很差,你在这里练死劲没用。
我:有用! 特别有用
...... (后面我没用)ps:上剧情纯属玩笑异步

BackgroundService是什么

  • 可是我看到这名字就知道不简单了,Background背后+Service服务==背后的干活
  • 其实也就是咱们理解的字面意思,BackgroundService是一个抽象类,继承IHostedService而后就拥有了StartAsync()、StopAsync()方法。
  • 当咱们继承BackgroundService以后须要重写ExecuteAsync抽象方法,而后咱们只须要在ExecuteAsync方法中写入本身须要执行的方法就能够了。
  • 而后在配置服务中心注入该方法就能够了services.AddHostedService ();,
  • 你就已经完成来了本身的任务了,是否是感受很简单呢?(逐渐了忘记了标题)

BackgroundService实现方式

  • 咱们经过F12能够进入源码中查看,总体的代码结构。继承IHostedService以后实现了StartAsync()、StopAsync()方法,可是多了一个ExecuteAsync方法和_executingTask字段、CancellationTokenSource标记
  • _executingTask是一个线程变量,主要用于存储异步ExecuteAsync方法
  • CancellationTokenSource标记源,这个我在Task博文中介绍过,用于取消线程进行。
  • 重点说一下StartAsync会在程序全部配置加载完以后才会执行。

BackgroundService拓展

如今咱们要实现一个轮询需求,咱们须要怎么作呢?(此时此刻我想望向红超哥,可是我一我的出差了,因此只能本身实现了)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个女友!!!!");
              }
       }

最后总结愿望成真

相关文章
相关标签/搜索