BackgroundService 大佬教的好_段丛磊的博客-程序员秘密

技术标签: spring  c#  python  java  设计模式  

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

最后总结愿望成真

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41472521/article/details/110364892

智能推荐

MVP模式研究与实践_疯狂小磊哥的博客-程序员秘密

虽然有那么多资料介绍MVP了,但是还是想把自己的实践经验分享一下。MVP简介相信大家对MVC都是比较熟悉了,:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 从MVC和MVP两者结合来看,Controlller/Presenter...

HBuilder发行App(Android和ios)_weixin_30873847的博客-程序员秘密

怎样将开发好的app测试和上架,此文包括Android和ios打包、测试和上架的大概过程。内容有些简陋,因为此过程踏坑无数,特此留念。特此声明:内容不全仅供参考。介绍两个参考网站:1. https://www.jianshu.com/p/be0267ebd2382. https://www.jianshu.com/p/665c1d67adde在此先感谢两位大侠详细的描述。...

c语言如何定义指针变量和使用,C语言指针变量的定义和使用(精华)_吟游诗人基德的博客-程序员秘密

一 、定义指针变量1.1 定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*,格式为:datatype *name;或者datatype *name = value;*表示这是一个指针变量,datatype表示该指针变量所指向的数据的类型 。例如:int *p1;1.2 赋值指针变量p1 是一个指向 int 类型数据的指针变量,至于 p1 究竟指向哪一份数据,应该由赋予它的值决定。再如...

【Tensorflow】slim.arg_scope()的使用_不用先生的博客-程序员秘密

【fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处】slim.arg_scope() 函数的使用       slim是一种轻量级的tensorflow库,可以使模型的构建,训练,测试都变得更加简单。在slim库中对很多常用的函数进行了定义,slim.arg_scope()是slim库中经常用到的函数之一。函数的定义如下;@tf...

vb matlab,[VB.NET]VB与MATLAB接口的实现_weixin_39884832的博客-程序员秘密

搜索热词VB与MATLAB接口的实现实例说明在本实例中,我们制作一个能够与Matlab进行交互的应用程序。程序运行结果如图78-1所示。图78-1 运行结果技术要点l 引用Matlab库l 执行Matlab命令l 结束Matlab实现过程■ 新建项目打开Visual Studio.NET,选择"新建项目",在项目类型窗口中选择"Visual Basic项目",在模板窗口中选择"Windows应用程...

随便推点

弹性公网IP(Elastic IP,EIP)_小麦苗DBA宝典的博客-程序员秘密

弹性公网IP(Elastic IP,EIP)https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_01...

laravel5.5路由匹配规则(.htaccess文件)的又一个坑_木豪末的博客-程序员秘密

今天调用的laravel的用户认证,生成对应控制器和视图文件之后,进行登录验证的突然给我报这个错我那么懵逼阿,还好感谢万能的百度,知道是.htaccess里面的路由访问规则导致的,原规则是这样的RewriteRule ^ index.php [L]这个规则要求路由后面必须有index.php,没有就会报错,于是我把规则改成这样RewriteRule ^(.*)$ /inde...

微信小程序之倒计时插件 wxTimer_微信 插件 时钟计时_极乐叔的博客-程序员秘密

介绍:  用于在微信小程序中进行倒计时的组件。功能:  1、最基础的当然就是倒计时功能了。  2、可以设置倒计时结束后执行的事件。  3、可以设置倒计时执行过程中每隔多少秒,执行一次对应的事件。下载: wxTimer在JS中调用 1.在当前js引入 timer = require('../../plug/wxTimer.js')  2.在全局app.js引入  app.jsg...

List中remove()方法的陷阱,被坑惨了!_程序猿DD_的博客-程序员秘密

作者 |倚楼听风雨来源 |https://blog.csdn.net/pelifymeng2/article/details/78085836Java的List在删除元素时,一般会用l...

线性规划学习材料_comcont的博客-程序员秘密

线性规划预处理技术相关论文:Linear programmingEfficient Presolving in Linear Programming by VISHNU V. SADHANAA Modular Presolve Procedure for Large Scale Linear Programming 1995线性规划模型预处理技术 2008Presolving in linear programming 1995...

推荐文章

热门文章

相关标签