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個女友!!!!");
              }
       }

最後總結願望成真

相關文章
相關標籤/搜索