BackgroundService 大佬教的好
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 大佬教的好相关推荐
- 清华大学车辆刚才专业大佬教你如何写SCI论文(转)
在B站看到清华大学车辆工程专业博士生的视频,教你如何写SCI论文,讲得非常好,对工科不好搞论文的专业有帮助,对科研入门或者迷茫没人指导的同学大有帮助. 国之栋梁的高校就是资源丰富,愿意分享知识.有个清 ...
- 腾讯大佬教我的工作方法(非常有效!)
最近越来越发现一个问题--"感觉团队的产品小伙伴都不太会工作".主要表现在效果和工作时长完全成反比.天天加班到晚上10点,然后产出的结果--(PS:偶尔摸鱼是肯定的,也没有怎么偷懒 ...
- 自学Java年薪20万的学习方法,大佬教你如何去学
不管你手初出茅庐的新人,还是久经沙场的老将,或许都曾经在办公室加班熬夜至凌晨两三点,三四个人围着一个电脑在解决bug,最后恍然发现原来是一个分号没写.如果你能看到此文章,请一定要将他看完,如果你是大佬 ...
- 做实验、修电脑、命题相亲……Python大佬教你七夕如何撩妹
在Google上输入Love,可以搜到12,220,000,000条结果. 关于爱情,中国古诗有"愿得一人心 白首不相离"这样的美句,西方有Love never fails的谚语. ...
- 代码 删除的stach 找回_阿里大佬教你,如何写好 Java 代码!
点击上方蓝色链接,关注并"设为星标" Java干货,每天及时推送 阿里大佬分享的一篇很不错的文章,推荐收藏! 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生 ...
- 大佬教你修改pycharm编辑器 简单的四步教你搞定界面风格修改
教你配置属于自己的PYcharm界面色彩风格,PYthon学习必备 GO 第一步,换成深色背景,保护视力 PyCharm默认的背景是白色的,比较刺眼.还是换成深色的比较好,而且感觉比较酷一点. 修改方 ...
- 如何做研究与写论文?周志华大佬教您方法论!
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 [导读]每个人从本科到硕士,再到博士.博士后,甚至工作以后,都会遇到做研究.写论文这个差事.论文 ...
- 黑客暗网叫卖Zoom账号密码,1分钱能买71个,加密大佬教袁征做人,17年前开源软件现在又火了...
晓查 郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI Zoom,现在是风口浪尖上的企业了. 疫情一来,用户数和股价齐飞,但问题也出现的不要太频繁. 一方面进入隐私泄露危机,一方面又因为 ...
- 中兴蓝剑计划与华为15级大佬教你如何做校招简历!
我是自动化专业的应届研究生,最终拿到了tplink.华为.vivo等公司的ssp的offer,分享自己学习过的计算机基础知识(C语言+操作系统+计算机网络+linux)以及数据结构与算法的相关知识,保 ...
最新文章
- “vector”: 不是“std”的成员_libcxx 的 std::function 源码分析
- python小孩的报酬_孩子做了家务,家长该不该支付“酬劳”呢?
- wc命令统计文件数据数量信息
- 上一次系统的关闭是意外的_教你如何一键极速重装系统
- boost 单io_serverce 异步多线程资源保护代码
- 【bzoj4321】queue2 dp
- 堆、栈及静态数据区详解
- UnityShader22:序列帧动画
- c语言数据结构用矩阵存储图,数据结构之---C语言实现图的数组(邻接矩阵)存储表示...
- 点击量作弊真的可以检测吗_作弊道德可以使自动驾驶汽车可行吗?
- 开源远程桌面软件_RustDesk_(可自建远程桌面服务器)
- 【读书笔记】《暗时间》
- as常用固定搭配_常用的有以下固定搭配
- PLC可编程控制器实训设备
- 到底哪一首才是唐诗第一?
- 用python编写加减乘除计算器_python实现加减乘除计算器
- 再论iPhone Push Notification
- DNS与HTTPDNS
- 监控mysql的pr,数据库监控指标操作手册
- Jetpack Navigation 真香预警
热门文章
- 解决[Vue warn]: Failed to resolve directive: loading
- 如何计算某一天是星期几
- 飞思卡尔MC9S12XEP100 CAN学习总结(三) 滤波器配置
- c语言里兹法解二阶微分方程,[2018年最新整理]FE-Ch变分原理与里兹法.ppt
- 浏览器元素退出全屏监听
- SLG项目开发经验二_大地图设计与实现
- 2D美术2——ps去特效图的黑色背景
- 基于J2EE的JSH框架和百度语音识别接口实现的语音记账APP
- 线性规划linprog
- Matlab应用于配送linprog,Matlab应用实例(4)—linprog(02高级)