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

海阳市住房和城乡建设局官方网站动漫设计与制作难学吗

海阳市住房和城乡建设局官方网站,动漫设计与制作难学吗,青岛做网站的公司哪家好一点,如何看网站排名这是一个大的题目#xff0c;需要用几篇文章来说清楚。这是第一篇。一、前言在我们的项目中#xff0c;有时候我们需要在应用程序启动前执行一些一次性的逻辑。比方说#xff1a;验证配置的正确性、填充缓存、或者运行数据库清理/迁移等。如何合理、有效、优雅地完成这个任务… 这是一个大的题目需要用几篇文章来说清楚。这是第一篇。 一、前言在我们的项目中有时候我们需要在应用程序启动前执行一些一次性的逻辑。比方说验证配置的正确性、填充缓存、或者运行数据库清理/迁移等。如何合理、有效、优雅地完成这个任务是这个文章讨论的主要内容。 要实现这样一个功能其实我们有几个选择使用IStartupFilter运行同步任务。这是一个内置的解决方案可以通过一些设置和技巧来运行异步任务使用IStartupFilter或IApplicationLifetime事件来运行异步任务这是一个可选的方案但有不足我们会在后面讲使用IHostedService在不阻塞应用启动的情况下运行一些一次性的任务关于这个内容我在前一篇文章ASP.NET Core 3.x控制IHostedService启动顺序浅探中有涉及到一部分内容在Program.cs中运行异步任务。在大多数情况下从代码的复杂度到效率上这都是一个比较好的选择。 先提个问题为什么要在应用启动时运行任务二、为什么要在应用启动时运行任务在应用启动并开始请求服务之前很多时候需要运行各种初始化工作。一个ASP.NET应用启动时需要完成很多事例如确定当前的宿主环境加载appsetting.json配置和环境变量配置并创建依赖注入的容器配置中间件管道这是应用启动时要完成的引导内容。在完成这些内容运行WebHost并开始监听请求之前还会有一些一次性任务需要启动例如检查强类型配置的有效性填充或恢复缓存数据库清理/迁移通常来说这不是个好主意但很多时候没有别的办法当然有些任务也不是一定要在开始监听请求之前运行这要看具体的运行任务的架构。一般来说如果缓存处理的完善是不需要提前启动的。当然清理/迁移数据库是必须放在服务启动之前。在微软官网上有一个例子是数据保护子系统用于即时加密cookie、防伪令牌等这个就必须在应用监听请求之前完成初始化并加载这个例子使用了IStartupFilter。三、使用IStartupFilter运行同步任务IStartupFilters作为配置中间件管道的一部分通常在Startup.Configure()中运行。它允许我们定制应用的中间件管道处理我们希望进行的所有任务。看一个简单的例子public class AutoRequestServicesStartupFilter : IStartupFilter {public ActionIApplicationBuilder Configure(ActionIApplicationBuilder next){return builder {builder.UseMiddlewareRequestServicesContainerMiddleware();next(builder);};} } IStartupFilter提供了一种可能在依赖注入容器配置完成之后、应用程序启动之前运行一些代码。因此我们可以在IStartupFilters中直接使用依赖注入。这表示我们可以运行有关系统的任何代码。在前边提到的微软官网的例子中就是创建了一个基于IStartupFilters的DataProtectionStartupFilter来初始化数据保护子系统。此外IStartupFilter允许我们通过向依赖注入容器注册服务来增加要执行的任务。这是一个很有用的特性表示我们可以注册一个在应用启动时运行的任务而不需要显式的调用。但是这儿有个问题。IStartupFilters通常运行的是同步的任务。看一下上面的代码Configure()方法不返回任务。当然我们硬要使用异步也是可以的但一般来说这不算个好主意。原因我后面会写。 写到这儿如果对ASP.NET Core架构熟悉就会引出另一个问题为什么不用健康检查来确认一次性任务的执行结果四、为什么不用健康检查运行健康检查是ASP.NET Core 2.2新引入的一个特性允许查询通过APIHTTP Endpoint公开的应用的健康状况。当应用部署在Kubernetes或反向代理HAProxy或Nginx后面时可以提供给代理用来检测应用是否准备好开始提供服务。我们可以使用健康检查来确保应用所有必需的一次性任务完成之前不会开始监听服务。但是这种方式会有一点问题。WebHost和Kestrel本身会在一次性任务执行前启动。当然这时他们还不会接收和处理服务请求但仍然引出了一些问题首先是增加了代码的复杂性。除了一次性任务的代码外还要增加健康检查来测试任务是否完成并同步和保持任务的状态其次如果任务失败了应用程序的健康检查将会让应用后续的任务无法继续执行。合理的流程是应用应该立即失败返回。这儿主要的原因是健康检查没有定义如何实际运行任务而只是定义了任务是否成功完成。相对来说这种状态机制比较单一在一些简单的任务中可能适用但不能全面覆盖一次性任务的全部场景。五、运行异步任务前边写了一些不太完美的方法。现在我们开始进入运行异步方法的一些步骤。当然运行异步也会有几种方式适用性上会有一定的区别。方式1使用IStartupFilter前边说过使用IStartupFilter时执行的是同步任务。所以我们可以通过GetAwater().GetResult()来调用异步。 我们拿数据迁移来举个例子。在EF Core中通过myDBContext.database.migrateasync()在运行时进行数据库迁移。其中myDBContext是应用程序中DBContext的一个实例。public class MigratorStartupFilter: IStartupFilter {private readonly IServiceProvider _serviceProvider;public MigratorStartupFilter(IServiceProvider serviceProvider){_serviceProvider  serviceProvider;}public ActionIApplicationBuilder Configure(ActionIApplicationBuilder next){using(var scope  _seviceProvider.CreateScope()){var myDbContext  scope.ServiceProvider.GetRequiredServiceMyDbContext();myDbContext.Database.MigrateAsync().GetAwaiter().GetResult();}return next;} } 通常GetAwaiter().GetResult()要注意避免死锁的问题。但这儿可能不需要因为这个代码只在启动时运行这时候还没有需要处理的请求所以不太会死锁。只能说这样可以用。不过习惯上我会避免这么做。方式2使用IApplicationLifetime事件这是另一个选择。可以通过IApplicationLifetime事件在应用启动和关闭时接收通知处理任务。但这个方式也有局限性。首先IApplicationLifetime使用cancellationtoken来注册回调也就是说这又是一个同步方式又需要使用GetAwaiter().GetResult()来调用异步。其次ApplicationStarted事件是在WebHost启动之后才会触发因此异步任务也是在应用开始监听请求后才运行。方式3使用IHostedServiceIHostedService可以让ASP.NET Core应用在后台执行长时间的任务。一般来说IHostedService用在周期性任务、消息传递等任务上但实际上它并不限于运行这些任务。在ASP.NET Core 3.x上WebHost本身也是建立在IHostedService上的。而且IHostedService本身就是异步的它提供了StartAsync和StopAsync。这种方式下我们的代码会是这样public class MigratorHostedService: IHostedService {private readonly IServiceProvider _serviceProvider;public MigratorStartupFilter(IServiceProvider serviceProvider){_serviceProvider  serviceProvider;}public async Task StartAsync(CancellationToken cancellationToken){using(var scope  _seviceProvider.CreateScope()){var myDbContext  scope.ServiceProvider.GetRequiredServiceMyDbContext();await myDbContext.Database.MigrateAsync();}}public Task StopAsync(CancellationToken cancellationToken){return Task.CompletedTask;} } 根据例子可以看出IHostedService可以直接运行异步任务。但是IHostedService也有局限性。从微软官网的说明来看IHostedService实现期望StartAsync能相对较快的返回。对于后台任务倾向于异步启动但主要任务在启动后执行。在上面这个例子中数据迁移本身不是问题但这个长时任务会阻止其它IHostedService启动和运行。而且应用会在IHostedService完成数据迁移前开始监听并响应请求这是一个严重的问题。方式4在Program.cs中运行上面三个方式都可以解决启动时运行异步任务的问题但都不够完美要么要求使用同步异步转同步可以用但有隐藏问题要么不能阻止应用启动会造成应用启动完成后可能异步任务还未完成的情况。我在前边的博文中写到过关于Program.cs中运行IHostedService的方式。具体可以去看ASP.NET Core 3.x控制IHostedService启动顺序浅探看一下Program.cs的默认代码public class Program {public static void Main(string[] args){CreateWebHostBuilder(args).Build().Run();}public static IWebHostBuilder CreateWebHostBuilder(string[] args) WebHost.CreateDefaultBuilder(args).UseStartupStartup(); } 在Build()创建WebHost之后调用Run()之前完全可以加入我们需要的代码。同时C# 7.1后主函数可以改为异步运行。因此我们可以在这儿做些文章public class Program {public static async Task Main(string[] args){IWebHost webHost  CreateWebHostBuilder(args).Build();using (var scope  webHost.Services.CreateScope()){var myDbContext  scope.ServiceProvider.GetRequiredServiceMyDbContext();await myDbContext.Database.MigrateAsync();}await webHost.RunAsync();}public static IWebHostBuilder CreateWebHostBuilder(string[] args) WebHost.CreateDefaultBuilder(args).UseStartupStartup(); } 这个方案的好处是这是真正的异步任务完成后应用程序才可以监听并接受请求此时已经构建了依赖注入容器所以可以创建服务当然同样也会有不足这儿只是构建了DI容器但并没有建立管道管道在Run()、RunAsync()后才建立然后是IStartupFilters执行再然后是应用程序启动。因此异步任务不能使用管道、IStartupFilters中的配置。不过这种需求的情况很少。六、总结这个部分牵扯到的框架内容比较多。我们从应用启动时异步运行任务开始说到了必要性也说到了几种解决方法及各自的优缺点。下一篇文章我会用一些具体的例子来说清楚这个方式的具体使用敬请关注。未完待续
http://www.pierceye.com/news/61225/

相关文章:

  • 广州市白云区网站建设维护免费响应式网站建设
  • 晋城住房保障和城乡建设管网站穆棱seo
  • 如何更新单位网站网站运营优化培训
  • 做网站需要什么技术人员长治哪家公司做网站好
  • 冠县做网站从seo角度谈网站建设
  • 学做网站从前端到后端贵州贵阳建网站的电话
  • 盐城市网站建设公司网络建设方式
  • 泉州公司建站模板个人创业做网站
  • 聊城网站制作9k9k网页游戏开服表
  • 做网站超链接网上做平面设计的网站
  • 乐都企业网站建设厦门某某公司网站
  • 思途做的旅游网站wordpress安装的模板文件
  • 谷歌做网站自己可以做企业网站吗
  • 深圳网站建设大概多少钱人力外包公司怎么赚钱
  • 人才招聘网站怎么做企业网站建设应避免数据孤岛
  • 学校网站对学校建设的重要性网站免费申请注册
  • 手机可以创建网站吗centos7.2做网站
  • 网站空间域名是什么企业网站内容模块
  • 建网站的服务器查不到网站备案
  • 网站项目建设流程和项目方案哪个网站可以找人做橱柜
  • 商城网站建设需要注意什么知名网站建设公司
  • 做网站衡水微信商城平台
  • 网站怎么样制作视频网站建设费用如何做账务处理
  • 自学网站编程中国十大地推公司
  • 苏州建网站的公wordpress语言文件编辑
  • 合肥网站建设教程网站注册局
  • 网站建设合同审批wordpress 前台英文
  • 建个网站的电话号码wordpress里面主题文档怎么编辑
  • 南宁微网站制作net网络网站建设
  • 山东省住房和城市建设厅网站在什么网站可以接国外的模具做