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

建设银行广州招聘网站网架公司和网架加工厂的区别

建设银行广州招聘网站,网架公司和网架加工厂的区别,团智慧团建登录入口,版面设计是什么上一篇文章中我们了解了 .NET Worker Service 的入门知识[1]#xff0c;今天我们接着介绍一下如何优雅地关闭和退出 Worker Service。Worker 类从上一篇文章中#xff0c;我们已经知道了 Worker Service 模板为我们提供三个开箱即用的核心文件#xff0c;其中 Worker 类是继… 上一篇文章中我们了解了 .NET Worker Service 的入门知识[1]今天我们接着介绍一下如何优雅地关闭和退出 Worker Service。Worker 类从上一篇文章中我们已经知道了 Worker Service 模板为我们提供三个开箱即用的核心文件其中 Worker 类是继承自抽象基类 BackgroundService 的而 BackgroundService 实现了 IHostedService 接口。最终 Worker 类会被注册为托管服务我们处理任务的核心代码就是写在 Worker 类中的。所以我们需要重点了解一下 Worker 及其基类。先来看看它的基类 BackgroundService 基类 BackgroundService 中有三个可重写的方法可以让我们绑定到应用程序的生命周期中抽象方法 ExecuteAsync作为应用程序主要入口点的方法。如果此方法退出则应用程序将关闭。我们必须在 Worker 中实现它。虚方法 StartAsync在应用程序启动时调用。如果需要可以重写此方法它可用于在服务启动时一次性地设置资源当然也可以忽略它。虚方法 StopAsync在应用程序关闭时调用。如果需要可以重写此方法在关闭时释放资源和销毁对象当然也可以忽略它。默认情况下 Worker 只重写必要的抽象方法 ExecuteAsync。新建一个 Worker Service 项目我们来新建一个 Worker Service使用 Task.Delay 来模拟关闭前必须完成的一些操作看看是否可以通过简单地在 ExecuteAsync 中 Delay 来模拟实现优雅关闭。需要用到的开发工具Visual Studio Codehttps://code.visualstudio.com/最新的 .NET SDKhttps://dotnet.microsoft.com/download安装好以上工具后在终端中运行以下命令创建一个 Worker Service 项目dotnet new Worker -n MyService 创建好 Worker Service 后在 Visual Studio Code 中打开应用程序然后构建并运行一下以确保一切正常dotnet build dotnet run 按 CTRLC 键关闭服务服务会立即退出默认情况下 Worker Service 的关闭就是这么直接在很多场景比如内存中的队列中这不是我们想要的结果有时我们不得不在服务关闭前完成一些必要的资源回收或事务处理。我们看一下 Worker 类的代码会看到它只重写了基类 BackgroundService 中的抽象方法 ExecuteAsyncprotected override async Task ExecuteAsync(CancellationToken stoppingToken) {while (!stoppingToken.IsCancellationRequested){_logger.LogInformation(Worker running at: {time}, DateTimeOffset.Now);await Task.Delay(1000, stoppingToken);} } 我们尝试修改一下此方法退出前做一些业务处理protected override async Task ExecuteAsync(CancellationToken stoppingToken) {while (!stoppingToken.IsCancellationRequested){_logger.LogInformation(Worker running at: {time}, DateTimeOffset.Now);// await Task.Delay(1000, stoppingToken);await Task.Delay(1000);}_logger.LogInformation(等待退出 {time}, DateTimeOffset.Now);Task.Delay(60_000).Wait(); //模拟退出前需要完成的工作_logger.LogInformation(退出 {time}, DateTimeOffset.Now); } 然后测试一下看它是不是会像我们预期的那样先等待 60 秒再关闭。dotnet build dotnet run 按 CTRLC 键关闭服务我们会发现它在输出 “等待退出” 后并没有等待 60 秒并输出 “退出” 之后再关闭而是很快便退出了。这就像我们熟悉的控制台应用程序默认情况下在我们点了右上角的关闭按钮或者按下 CTRLC 键时会直接关闭一样。Worker Service 优雅退出那么怎么才能实现优雅退出呢方法其实很简单那就是将 IHostApplicationLifetime 注入到我们的服务中然后在应用程序停止时手动调用 IHostApplicationLifetime 的 StopApplication 方法来关闭应用程序。修改 Worker 的构造函数注入 IHostApplicationLifetimeprivate readonly IHostApplicationLifetime _hostApplicationLifetime; private readonly ILoggerWorker _logger;public Worker(IHostApplicationLifetime hostApplicationLifetime, ILoggerWorker logger) {_hostApplicationLifetime hostApplicationLifetime;_logger logger; } 然后在 ExecuteAsync 中处理完退出前必须完成的业务逻辑后手动调用 IHostApplicationLifetime 的 StopApplication 方法下面是丰富过的 ExecuteAsync 代码protected override async Task ExecuteAsync(CancellationToken stoppingToken) {try{// 这里实现实际的业务逻辑while (!stoppingToken.IsCancellationRequested){try{_logger.LogInformation(Worker running at: {time}, DateTimeOffset.Now);await SomeMethodThatDoesTheWork(stoppingToken);}catch (Exception ex){_logger.LogError(ex, Global exception occurred. Will resume in a moment.);}await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);}}finally{_logger.LogWarning(Exiting application...);GetOffWork(stoppingToken); //关闭前需要完成的工作_hostApplicationLifetime.StopApplication(); //手动调用 StopApplication} }private async Task SomeMethodThatDoesTheWork(CancellationToken cancellationToken) {_logger.LogInformation(我爱工作埋头苦干ing……);await Task.CompletedTask; }/// summary /// 关闭前需要完成的工作 /// /summary private void GetOffWork(CancellationToken cancellationToken) {_logger.LogInformation(啊糟糕有一个紧急 bug 需要下班前完成);_logger.LogInformation(啊啊啊我爱加班我要再干 20 秒Wait 1 );Task.Delay(TimeSpan.FromSeconds(20)).Wait();_logger.LogInformation(啊啊啊啊啊啊我爱加班我要再干 1 分钟Wait 2 );Task.Delay(TimeSpan.FromMinutes(1)).Wait();_logger.LogInformation(啊哈哈哈哈哈终于好了下班走人); } 此时再次 dotnet run 运行服务然后按 CTRLC 键关闭服务您会发现关闭前需要完成的工作 GetOffWork 运行完成后才会退出服务了。至此我们已经实现了 Worker Service 的优雅退出。StartAsync 和 StopAsync为了更进一步了解 Worker Service我们再来丰富一下我们的代码重写基类 BackgroundService 的 StartAsync 和 StopAsync 方法public class Worker : BackgroundService {private bool _isStopping false; //是否正在停止工作private readonly IHostApplicationLifetime _hostApplicationLifetime;private readonly ILoggerWorker _logger;public Worker(IHostApplicationLifetime hostApplicationLifetime, ILoggerWorker logger){_hostApplicationLifetime hostApplicationLifetime;_logger logger;}public override Task StartAsync(CancellationToken cancellationToken){_logger.LogInformation(上班了又是精神抖擞的一天output from StartAsync);return base.StartAsync(cancellationToken);}protected override async Task ExecuteAsync(CancellationToken stoppingToken){try{// 这里实现实际的业务逻辑while (!stoppingToken.IsCancellationRequested){try{_logger.LogInformation(Worker running at: {time}, DateTimeOffset.Now);await SomeMethodThatDoesTheWork(stoppingToken);}catch (Exception ex){_logger.LogError(ex, Global exception occurred. Will resume in a moment.);}await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);}}finally{_logger.LogWarning(Exiting application...);GetOffWork(stoppingToken); //关闭前需要完成的工作_hostApplicationLifetime.StopApplication(); //手动调用 StopApplication}}private async Task SomeMethodThatDoesTheWork(CancellationToken cancellationToken){if (_isStopping)_logger.LogInformation(假装还在埋头苦干ing…… 其实我去洗杯子了);else_logger.LogInformation(我爱工作埋头苦干ing……);await Task.CompletedTask;}/// summary/// 关闭前需要完成的工作/// /summaryprivate void GetOffWork(CancellationToken cancellationToken){_logger.LogInformation(啊糟糕有一个紧急 bug 需要下班前完成);_logger.LogInformation(啊啊啊我爱加班我要再干 20 秒Wait 1 );Task.Delay(TimeSpan.FromSeconds(20)).Wait();_logger.LogInformation(啊啊啊啊啊啊我爱加班我要再干 1 分钟Wait 2 );Task.Delay(TimeSpan.FromMinutes(1)).Wait();_logger.LogInformation(啊哈哈哈哈哈终于好了下班走人);}public override Task StopAsync(CancellationToken cancellationToken){_logger.LogInformation(太好了下班时间到了output from StopAsync at: {time}, DateTimeOffset.Now);_isStopping true;_logger.LogInformation(去洗洗茶杯先……, DateTimeOffset.Now);Task.Delay(30_000).Wait();_logger.LogInformation(茶杯洗好了。, DateTimeOffset.Now);_logger.LogInformation(下班喽 ^_^, DateTimeOffset.Now);return base.StopAsync(cancellationToken);} } 重新运行一下dotnet build dotnet run 然后按 CTRLC 键关闭服务看看运行结果是什么我们可以观察到在 Worker Service 启动和关闭时基类 BackgroundService 中可重写的三个方法的运行顺序分别如下图所示总结在本文中我通过一个实例介绍了如何优雅退出 Worker Service 的相关知识。Worker Service 本质上仍是一个控制台应用程序执行一个作业。但它不仅可以作为控制台应用程序直接运行也可以使用 sc.exe 实用工具安装为 Windows 服务还可以部署到 linux 机器上作为后台进程运行。以后有时间我会介绍更多关于 Worker Service 的知识。您可以从 GitHub 下载本文中的源码[2]。相关链接https://mp.weixin.qq.com/s/ujGkb5oaXq3lqX_g_eQ3_g .NET Worker Service 入门介绍 ↩︎https://github.com/ITTranslate/WorkerServiceGracefullyShutdown 源码下载 ↩︎作者 技术译民出品 技术译站https://ITTranslator.cn/END
http://www.huolong8.cn/news/74904/

相关文章:

  • dedecms建站教程福田网站设计哪家好
  • 红杉网站建设哪里有免费的ppt模板下载网站
  • 广州网站制作长沙局域网建WordPress
  • 网站设计东莞河南住房和城乡建设厅职称网站
  • 浙江手机网站建设宁波人流
  • 阿里云域名如何做网站wordpress 图片接口怎么用
  • 重庆金融网站建设湛江有帮公司做网站
  • 宜昌公司做网站世界500强企业市值排名
  • 网站建设远程工作做网站买主机还是服务器
  • 南山网站建设多少钱上海jsp网站建设
  • 广州购物网站建设价格搭建网站需要备案吗
  • 网站建设优化网站排名泰安做网站的
  • 国外优秀网站模板网站建设洽谈
  • 做网站移交资料湛江网站搜索优化
  • 怎么做网站内链做营销网站应该要注意些什么
  • 网页设计的网网页设计的网站建设银行积分商城网站
  • 网站布局规范网站建设教程下载
  • 成都做营销型网站网站首页代码在哪里
  • 在线模版下载网站怎么网上推广自己的产品
  • 如何给网站建设提意见负面信息搜索引擎 网站
  • 公司网站建设宣传安徽信息工程学院信息门户平台
  • 如何自己开个网站平台沈阳网站建设电话
  • 怎么建网站快捷方式注册公司名字有没有重复在哪可以查
  • 长垣县做网站的酒店官方网站建设书
  • 呼伦贝尔建设网站wordpress 文章点击排行
  • 嘉兴网站关键词优化男的怎么做直播网站
  • 阿里云网站怎么备案域名网站后台维护技能
  • 广州seo公司品牌网络推广优化网站
  • 佛山app开发公司南昌seo网站推广费用
  • 小说网站排名人气如何用织梦程序制作多个页面网站