BackgroundService 大佬教的好
2020-11-29 19:23
543 查看
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; &nbs ad8 p; //方法初始话 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( 15a8 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个女朋友!!!!"); } }
最后总结愿望成真
相关文章推荐
- 乌镇大会前两天,互联网大佬演讲干货汇总
- 社交网络发展前景向好 行业大佬该做SNS应用啦!
- 求求大佬帮下忙
- 区块链、数字货币各方大佬观点(徐小平、吴晓波、薛蛮子)
- kuangbin大佬的poj题目分类
- 洛谷3724 [AH2017/HNOI2017]大佬
- 抽象和接口的区别(根据知乎大佬的讨论整理)
- win10 VC++6.0 应用程序无法正常运行 0xc0000142【大佬解决的方法】(转载)
- 跟着大佬做三轴
- 求各位大佬帮写一下这道题。
- 深藏不露的投资界大佬
- JAVA基础问题,求大佬指教
- 求大佬指点一下,程序报错不知道怎么改
- 大佬,您的选房系统已上线
- spyder ,python 3.6.5,运行出现引用错误,ImportError: cannot import name '_path',求大佬指导
- 测试 | 大佬与韭菜的区别,你准备好面对现实了吗?
- (求助大佬)Luogu P1189 `SEARCH`
- 数据科学大佬的简历上都有哪些技能?
- 2018 ccpc-wannafly winter camp结营总结(那些年,那些ACM大佬)
- 这些年,这些ACM大佬-洪华敦访谈