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. 清华大学车辆刚才专业大佬教你如何写SCI论文(转)

    在B站看到清华大学车辆工程专业博士生的视频,教你如何写SCI论文,讲得非常好,对工科不好搞论文的专业有帮助,对科研入门或者迷茫没人指导的同学大有帮助. 国之栋梁的高校就是资源丰富,愿意分享知识.有个清 ...

  2. 腾讯大佬教我的工作方法(非常有效!)

    最近越来越发现一个问题--"感觉团队的产品小伙伴都不太会工作".主要表现在效果和工作时长完全成反比.天天加班到晚上10点,然后产出的结果--(PS:偶尔摸鱼是肯定的,也没有怎么偷懒 ...

  3. 自学Java年薪20万的学习方法,大佬教你如何去学

    不管你手初出茅庐的新人,还是久经沙场的老将,或许都曾经在办公室加班熬夜至凌晨两三点,三四个人围着一个电脑在解决bug,最后恍然发现原来是一个分号没写.如果你能看到此文章,请一定要将他看完,如果你是大佬 ...

  4. 做实验、修电脑、命题相亲……Python大佬教你七夕如何撩妹

    在Google上输入Love,可以搜到12,220,000,000条结果. 关于爱情,中国古诗有"愿得一人心 白首不相离"这样的美句,西方有Love never fails的谚语. ...

  5. 代码 删除的stach 找回_阿里大佬教你,如何写好 Java 代码!

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

  6. 大佬教你修改pycharm编辑器 简单的四步教你搞定界面风格修改

    教你配置属于自己的PYcharm界面色彩风格,PYthon学习必备 GO 第一步,换成深色背景,保护视力 PyCharm默认的背景是白色的,比较刺眼.还是换成深色的比较好,而且感觉比较酷一点. 修改方 ...

  7. 如何做研究与写论文?周志华大佬教您方法论!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 [导读]每个人从本科到硕士,再到博士.博士后,甚至工作以后,都会遇到做研究.写论文这个差事.论文 ...

  8. 黑客暗网叫卖Zoom账号密码,1分钱能买71个,加密大佬教袁征做人,17年前开源软件现在又火了...

    晓查 郭一璞 发自 凹非寺  量子位 报道 | 公众号 QbitAI Zoom,现在是风口浪尖上的企业了. 疫情一来,用户数和股价齐飞,但问题也出现的不要太频繁. 一方面进入隐私泄露危机,一方面又因为 ...

  9. 中兴蓝剑计划与华为15级大佬教你如何做校招简历!

    我是自动化专业的应届研究生,最终拿到了tplink.华为.vivo等公司的ssp的offer,分享自己学习过的计算机基础知识(C语言+操作系统+计算机网络+linux)以及数据结构与算法的相关知识,保 ...

最新文章

  1. “vector”: 不是“std”的成员_libcxx 的 std::function 源码分析
  2. python小孩的报酬_孩子做了家务,家长该不该支付“酬劳”呢?
  3. wc命令统计文件数据数量信息
  4. 上一次系统的关闭是意外的_教你如何一键极速重装系统
  5. boost 单io_serverce 异步多线程资源保护代码
  6. 【bzoj4321】queue2 dp
  7. 堆、栈及静态数据区详解
  8. UnityShader22:序列帧动画
  9. c语言数据结构用矩阵存储图,数据结构之---C语言实现图的数组(邻接矩阵)存储表示...
  10. 点击量作弊真的可以检测吗_作弊道德可以使自动驾驶汽车可行吗?
  11. 开源远程桌面软件_RustDesk_(可自建远程桌面服务器)
  12. 【读书笔记】《暗时间》
  13. as常用固定搭配_常用的有以下固定搭配
  14. PLC可编程控制器实训设备
  15. 到底哪一首才是唐诗第一?
  16. 用python编写加减乘除计算器_python实现加减乘除计算器
  17. 再论iPhone Push Notification
  18. DNS与HTTPDNS
  19. 监控mysql的pr,数据库监控指标操作手册
  20. Jetpack Navigation 真香预警

热门文章

  1. 解决[Vue warn]: Failed to resolve directive: loading
  2. 如何计算某一天是星期几
  3. 飞思卡尔MC9S12XEP100 CAN学习总结(三) 滤波器配置
  4. c语言里兹法解二阶微分方程,[2018年最新整理]FE-Ch变分原理与里兹法.ppt
  5. 浏览器元素退出全屏监听
  6. SLG项目开发经验二_大地图设计与实现
  7. 2D美术2——ps去特效图的黑色背景
  8. 基于J2EE的JSH框架和百度语音识别接口实现的语音记账APP
  9. 线性规划linprog
  10. Matlab应用于配送linprog,Matlab应用实例(4)—linprog(02高级)