BackgroundService 源码分析

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

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

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

当时我满脑子都在想一个剧情

红超哥:年轻人你这样写代码不优雅,可读性不好,你在这里练死劲没用。

我:有用! 特别有用

...... (后面我没用)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拓展

现在我们要实现一个轮询需求,我们需要怎么做呢?(此时此刻我想望向红超哥,但是我一个人出差了,所以只能自己实现了)

       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添加就好了,我们也可以直接通过开始方法、结束方法控制就好了

       public class  GetGirlfriend: InitBackgroundWork
       {
              protected override void DoWork(object state)
              {
                     Console.WriteLine("给我1个女朋友!!!!");
              }
       }

最后总结愿望成真

BackgroundService 大佬教的好的更多相关文章

  1. 阿里大佬教你,如何写好 Java 代码!

    点击上方蓝色链接,关注并"设为星标" Java干货,每天及时推送 阿里大佬分享的一篇很不错的文章,推荐收藏! 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生 ...

  2. react this的作用域问题,麻烦大佬们帮我解决一下

    element里面有个Table组件,我想在编辑和删除那里加上点击事件,但是发现点击方法没有效果 这里面的this看起来好像只针对这个作用域里面的,这里没有办法设置状态,也不能调用方法 设置状态会出现 ...

  3. python爬虫xpath

    又是一个大晴天,因为马上要召开十九大,北京地铁就额外的拥挤,人贴人到爆炸,还好我常年挤地铁早已练成了轻功水上漂,挤地铁早已经不在话下. 励志成为一名高级测试工程师的我,目前还只是个菜鸟,难得有机会,公 ...

  4. 「CF#554 div2」题解

    A 水题一道. 题目的大致意思就是:给你两个集合,求集合间有多少数对和是奇数. 题解,开\(4\)个桶后,求一个\(min\)就可以了. #include <bits/stdc++.h> ...

  5. 「HGOI#2019.4.19省选模拟赛」赛后总结

    t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...

  6. 01-vue学习篇-以优雅的姿势创建vue项目

    前言 小白一枚,今年(2019)准备学习一下前端的技术,因为发现自己对后端(python)相对比较熟悉但是还是写不出一个优雅的系统,可见前端的重要性,于是静下心来跟大佬学习.在不断的激励自己调整自己的 ...

  7. 「洛谷5283」「LOJ3048」「十二省联考2019」异或粽子【可持久化01trie+优先队列】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 让你求区间异或和前\(k\)大的异或和的和. 正解 这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队) 我们做过某一些题 ...

  8. 菜刀(代码执行)函数和命令执行函数详解及Getshell方法

    i春秋作家:大家奥斯的哦 原文来自:https://bbs.ichunqiu.com/thread-41471-1-1.html 代码执行函数 VS 命令执行函数 一直想整理这两块的内容,但是一直没时 ...

  9. bitcoinj学习记录

    一.密码学相关资料 使用Bouncy Castle生成数字签名.数字信封 ECDH and ECDSA(ECC椭圆曲线算法3) 数字签名算法RSA与 ECDSA的比较与分析 Java密码学 非对称加密 ...

随机推荐

  1. 4G DTU为什么要具有透传的功能

    4G DTU为什么要透传 透传的目的就是为了在数据传输的过程中不对数据做任何出来,实现发送方和接收方的数据完全一样,长度和内容完全没有变化.它主要是使用在智能设备之间的远程串口数据传输,是一种和传输方 ...

  2. net core webapi多版本控制与nswag 交互

    前言 首先希望webapi 支持多版本,swagger针对不同的版本可进行交互.netcore 基于Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 包, ...

  3. 蒲公英 · JELLY技术周刊 Vol.28: Next.js 10 发布

    蒲公英 · JELLY技术周刊 Vol.28 前端应用到底该选 SSR 还是 CSR?每个项目技术栈决策的时候都会根据实际需求有自己的看法,而在不久前 React 17 发布之后,自然而然也会有同学好 ...

  4. linux-gcc简要知识点 **

    目录 交叉编译 简要知识点 ** 一些概念 GCC编译器 GCC简要使用 GCC编译过程 ** 常用的编译选项 编译多个文件 制作.使用动态库 制作.使用静态库 很有用的选项 参考 交叉编译 使用不同 ...

  5. Linux系统下安装配置JDK(rpm方式及tar.gz方式)

    以前都是在Windows环境进行开发的,最近因工作需要:学习在Linux系统下搭建开发环境,自此记录搭建过程,以方便查阅. 本文借鉴了 Angel挤一挤 .小五 两位的博客. 准备材料: JDK下载链 ...

  6. Java实现酒店客房管理系统

    这篇文章主要为大家详细介绍了Java实现酒店客房管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Java实现酒店客房管理系统的具体代码,供大家参考,具体内容如下 Log ...

  7. Hive Join优化

    在阐述Hive Join具体的优化方法之前,首先看一下Hive Join的几个重要特点,在实际使用时也可以利用下列特点做相应优化: 1. 只支持等值连接 2. 底层会将写的HQL语句转换为MapRed ...

  8. Python_环境搭建_jupyterNotebook的使用

    # @ Author : Collin_PXY # 虚拟环境的创建及Jupyter Notebook的基本使用 # Anaconda 和 Jupter Notebook的使用: # 首先得需要安装 A ...

  9. Future Callable 线程池 例1

    package com.niewj.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.Exec ...

  10. 用 Cloud Performance Test怎么录制测试脚本

    Cloud Performance Test 云压力测试平台(以下简称:CPT)可以提供一站式全链路云压力测试服务,通过分布式压力负载机,快速搭建系统高并发运行场景,按需模拟千万级用户实时访问,并结合 ...