当前位置: 首页 > news >正文

做网站包含的技术滨江道做网站公司

做网站包含的技术,滨江道做网站公司,长沙市设计网站公司,网站开发下载哪个前言很多时候#xff0c;后台任务对我们来说是一个利器#xff0c;帮我们在后面处理了成千上万的事情。在.NET Framework时代#xff0c;我们可能比较多的就是一个项目#xff0c;会有一到多个对应的Windows服务#xff0c;这些Windows服务就可以当作是我们所说的后台任务… 前言很多时候后台任务对我们来说是一个利器帮我们在后面处理了成千上万的事情。在.NET Framework时代我们可能比较多的就是一个项目会有一到多个对应的Windows服务这些Windows服务就可以当作是我们所说的后台任务了。我喜欢将后台任务分为两大类一类是不停的跑好比MQ的消费者,RPC的服务端。另一类是定时的跑好比定时任务。那么在.NET Core时代是不是有一些不同的解决方案呢答案是肯定的。Generic Host就是其中一种方案也是本文的主角。什么是Generic HostGeneric Host是ASP.NET Core 2.1中的新增功能它的目的是将HTTP管道从Web Host的API中分离出来从而启用更多的Host方案。这样可以让基于Generic Host的一些特性延用一些基础的功能。如如配置、依赖关系注入和日志等。Generic Host更倾向于通用性换句话就是说我们即可以在Web项目中使用也可以在非Web项目中使用虽然有时候后台任务混杂在Web项目中并不是一个太好的选择但也并不失是一个解决方案。尤其是在资源并不充足的时候。比较好的做法还是让其独立出来让它的职责更加单一。下面就先来看看如何创建后台任务吧。后台任务示例我们先来写两个后台任务(一个一直跑一个定时跑)体验一下这些后台任务要怎么上手同样也是我们后面要使用到的。这两个任务统一继承BackgroundService这个抽象类而不是IHostedService这个接口。后面会说到两者的区别。一直跑的后台任务先上代码来看看里面的细节。我们的这个服务继承了BackgroundService就一定要实现里面的ExecuteAsync至于StartAsync和StopAsync等方法可以选择性的override。我们ExecuteAsync在里面就是输出了一下日志然后休眠在配置文件中指定的秒数。这个任务可以说是最简单的例子了其中还用到了依赖注入如果想在任务中注入数据仓储之类的应该就不需要再多说了。同样的方式再写一个定时的。定时跑的后台任务这里借助了Timer来完成定时跑的功能同样的还可以结合Quartz来完成。和第一个后台任务相比没有太大的差异。下面我们先来看看如何用控制台的形式来启动这两个任务。控制台形式这里会同时引入NLog来记录任务跑的日志方便我们观察。Main函数的代码如下对于控制台的方式需要我们对HostBuilder有一定的了解虽说它和WebHostBuild有相似的地方。可能大部分时候我们是直接使用了WebHost.CreateDefaultBuilder(args)来构造的如果对CreateDefaultBuilder里面的内容没有了解那么对上面的代码可能就不会太清晰。上述代码的大致流程如下new一个HostBuilder对象配置日志主要是接入了NLogHost的配置这里主要是引入了CommandLine因为需要传递参数给程序应用的配置指定了配置文件和引入CommandLineService的配置这个就和我们在Startup里面写的差不多了最主要的是我们的后台服务要在这里注入启动其中2-5的顺序可以按个人习惯来写里面的内容也和我们写Startup大同小异。第6步启动的时候有多种方式这里列出了两种行为等价的方式。a. 通过RunConsoleAsync的方式来启动b. 先StartAsync然后再WaitForShutdownAsyncRunConsoleAsync的奥秘我觉得还是直接看下面的代码比较容易懂。这里涉及到了一个比较重要的IHostLifetimeHost的生命周期ConsoleLifeTime是默认的一个可以理解成当接收到ctrlc这样的指令时它就会触发停止。接下来写一下nlog的配置文件?xml version1.0 encodingutf-8 ? nlog xmlnshttp://www.nlog-project.org/schemas/NLog.xsd xsi:schemaLocationNLog NLog.xsdxmlns:xsihttp://www.w3.org/2001/XMLSchema-instanceautoReloadtrueinternalLogLevelInfo targetstarget xsi:typeFilenameghostfileNamelogs/ghost.loglayout${date}|${level:uppercasetrue}|${message} //targetsruleslogger nameGHost.* minlevelInfo writeToghost /logger nameMicrosoft.* minlevelInfo writeToghost //rules /nlog这个时候已经可以通过命令启动我们的应用了。dotnet run -- --environment Staging这里指定了运行环境为Staging而不是默认的Production。在构造HostBuilder的时候可以通过UseEnvironment或ConfigureHostConfiguration直接指定运行环境但是个人更加倾向于在启动命令中去指定避免一些不可控因素。这个时候大致效果如下虽然效果已经出来了不过大家可能会觉得这个有点小打小闹下面来个略微复杂一点的后台任务用来监听并消费RabbitMQ的消息。消费MQ消息的后台任务代码细节就不需要多说了下面就启动MQ发送程序来模拟消息的发送同时看我们任务的日志输出由启动到停止效果都是符合我们预期的。下面再来看看Web形式的后台任务是怎么处理的。Web形式这种模式下的后台任务其实就是十分简单的了。我们只要在Startup的ConfigureServices方法里面注册我们的几个后台任务就可以了。启动Web站点后我们发了20条MQ消息再访问了一下Web站点的首页最后是停止站点。下面是日志结果都是符合我们的预期。可能大家会比较好奇这三个后台任务是怎么混合在Web项目里面启动的。答案就在下面的两个链接里。https://github.com/aspnet/Hosting/blob/2.1.1/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs#L153https://github.com/aspnet/Hosting/blob/2.1.1/src/Microsoft.AspNetCore.Hosting/Internal/HostedServiceExecutor.cs上面说了那么多都是在本地直接运行的可能大家会比较关注这个要怎样部署下面我们就不看看怎么部署。部署部署的话针对不同的情形(web和非web)都有不同的选择。正常来说如果本身就是web程序那么平时我们怎么部署的就和平时那样部署即可。花点时间讲讲部署非web的情形。其实这里的部署等价于让程序在后台运行。在Linux下面让程序在后台运行方式有好多好多Supervisor、Screen、pm2、systemctl等。这里主要介绍一下systemctl同时用上面的例子来进行部署由于个人服务器没有MQ环境所以没有启用消费MQ的后台任务。先创建一个 service 文件vim /etc/systemd/system/ghostdemo.service内容如下[Unit] DescriptionGeneric Host Demo[Service] WorkingDirectory/var/www/ghost ExecStart/usr/bin/dotnet /var/www/ghost/ConsoleGHost.dll --environment Staging KillSignalSIGINT SyslogIdentifierghost-example[Install] WantedBymulti-user.target其中各项配置的含义可以自行查找这里不作说明。然后可以通过下面的命令来启动和停止这个服务service ghostdemo start service ghostdemo stop 测试无误之后就可以设为自启动了。systemctl enable ghostdemo.service下面来看看运行的效果我们先启动服务然后去查看实时日志可以看到应用的日志不停的输出。当我们停了服务再看实时日志就会发现我们的两个后台任务已经停止了也没有日志再进来了。再去看看服务系统日志sudo journalctl -fu ghostdemo.service发现它确实也是停了。在这里我们还可以看到服务的当前环境和根路径。IHostedService和BackgroundService的区别前面的所有示例中我们用的都是BackgroundService而不是IHostedService。这两者有什么区别呢可以这样简单的理解IHostedService是原料BackgroundService是一个用原料加工过一部分的半成品。这两个都是不能直接当成成品来用的都需要进行加工才能做成一个可用的成品。同时也意味着如果使用IHostedService可能会需要做比较多的控制。基于前面的打印后台任务在这里使用IHostedService来实现。如果我们只是纯綷的把实现代码放到StartAsync方法中那么可能就会有惊喜了。运行之后想用ctrlc来停止发现还是一直在跑。ps一看这个进程还在kill掉之后才不会继续输出。。问题出在那里呢原因其实还是比较明显的因为这个任务还没有启动成功一直处于启动中的状态换句话说StartAsync方法还没有执行完。这个问题一定要小心再小心。要怎么处理这个问题呢解决方法也比较简单可以通过引用一个变量来记录要运行的任务将其从StartAsync方法中解放出来。这样就能让这个任务真正的启动成功了效果就不放图了。相对来说BackgroundService用起来会比较简单实现核心的ExecuteAsync这个抽象方法就差不多了出错的概率也会比较低。IHostBuilder的扩展写法在注册服务的时候我们还可以通过编写IHostBuilder的扩展方法来完成。使用的时候就可以像下面一样。总结Generic Host让我们可以用熟悉的方式来处理后台任务不得不说这是一个很?的特性。无论是将后台任务独立一个项目还是将其混搭在Web项目中都已经符合不少应用的情景了。最后放上本文用到的示例代码 https://github.com/catcherwong/Demos/tree/master/src/GenericHostDemo 相关文章在.NET Core微服务中使用HostBuilder和Generic HostAsp.net Core 2.1新功能Generic Host(通用主机)深度学习ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务.NET Core开源组件:后台任务利器之HangfireQuartz.Net分布式任务管理平台第二版Asp.Net Core 使用Quartz基于界面画接口管理做定时任务.Net Core小技巧 - Hosted Services Quartz实现定时任务调度原文地址: https://www.cnblogs.com/catcher1994/p/9961228.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://www.zqtcl.cn/news/657286/

相关文章:

  • 网站每年维护费用天津智能网站建设
  • php开发网站建设仿摄影网站
  • 动漫网站源码下载百度指数是啥
  • 建站之星演示谷歌网站建站
  • wordpress是建站工具 还是语言表格制作
  • 北京中国建设银行招聘信息网站店标logo图片免费制作
  • 网站建设分金手指专业二七文章网站是怎么做的
  • 东莞网站设计企业怎么制作手机app及网站
  • 林州做网站下载做蛋糕网站
  • 做网站改版的做实验用哪些国外网站
  • 什么是静态页面网站甜品网站建设方案
  • 做一个网站大概多少钱养生网站源码
  • 淘宝客网站建设分类校园网站开发设计报告
  • 个人网站模板 免费儿童编程培训机构
  • 运动健身型网站开发免费ddns域名注册
  • 专业pc网站建设wordpress 支持php7.1
  • 廊坊网站制作系统虚拟服务器搭建
  • 做网站的优势wordpress百度索引链接
  • 网站哪些功能是PHP做的wordpress 正文宽度
  • wordpress考试主题株洲优化公司
  • 怎么做企业网站建设方案怎样查网站有没有备案
  • 浙江短视频seo优化网站专做童装的网站
  • 印刷包装公司网站模板陕西住房和城乡建设厅网站
  • 成都响应式网站建设公司网站 建设的必要性
  • 江苏省建设局官方网站查询wordpress收到登录错误
  • 个人与企业签订网站开发合同北京个人网站建设
  • 阀门网站设计dede静态网站
  • 做暧暧视频网站在线网站建设项目推文
  • 岳池发展建设集团有限公司门户网站毕设做网站工作量够吗
  • 手机网站客户端设计与实现手机网站 焦点图