async

.net 中的async,await理解

江枫思渺然 提交于 2020-01-02 04:47:45
理解: 1、async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异) 2、当async方法执行遇到await,则立即将控制权转移到async方法的调用者 3、由调用者决定是否需要等待async方法执行完再继续往下执行 4、await会挂起当前方法,即阻塞当前方法继续往下执行,转交控制权给调用者 注意:如果调用一个async方 法,却不使用await关键字来标记一个挂起点的话,程序将会忽略async关键字并以同步的方式执行。编译器会对类似的问题发出警告。 例子一:(控制台程序) 1 static void Main(string[] args) 2 { 3 MyMain();//由于main方法无法定义成async,顾此定义一个方法MyMain来表示main方法。 4 Console.Read(); 5 } 6 static async void MyMain() 7 { 8 Console.WriteLine("main方法开始执行"); 9 AsyncAction(); 10 Console.WriteLine("main方法继续执行"); 11 Console.WriteLine("main方法执行结束"); 12 } 13 14 static async Task<string> AsyncAction() 15 { 16 Console

走进异步编程的世界 - 开始接触 async/await

痴心易碎 提交于 2020-01-02 04:42:07
走进异步编程的世界 - 开始接触 async/await 【转载出处】 https://www.cnblogs.com/liqingwen/p/5831951.html 序   这是学习异步编程的入门篇。   涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $"" 来拼接字符串,相当于string.Format() 方法。 目录 What's 异步? async/await 结构 What’s 异步方法? 一、What's 异步? 启动程序时,系统会在内存中创建一个新的进程。进程是构成运行程序资源的集合。 在进程内部,有称为线程的内核对象,它代表的是真正的执行程序。系统会在 Main 方法的第一行语句就开始线程的执行。 线程: ①默认情况,一个进程只包含一个线程,从程序的开始到执行结束; ②线程可以派生自其它线程,所以一个进程可以包含不同状态的多个线程,来执行程序的不同部分; ③一个进程中的多个线程,将共享该进程的资源; ④系统为处理器执行所规划的单元是线程,而非进程。 一般来说我们写的控制台程序都只使用了一个线程,从第一条语句按顺序执行到最后一条。但在很多的情况下,这种简单的模型会在性能或用户体验上不好。 例如:服务器要同时处理来自多个客户端程序的请求,又要等待数据库和其它设备的响应,这将严重影响性能

asp.net core 中间件应用

老子叫甜甜 提交于 2020-01-02 02:38:59
中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件: 选择是否将请求传递到管道中的下一个组件。 可在调用管道中的下一个组件前后执行工作。 请求委托(Request delegates)用于生成请求管道。 请求委托处理每个 HTTP 请求。 每个中间件扩展方法都通过 Microsoft.AspNetCore.Builder 命名空间在 IApplicationBuilder 上公开。 public class Startup { public void Configure(IApplicationBuilder app) { app.Run(async context => { await context.Response.WriteAsync("Hello, World!"); }); } } 中间件(Middleware)的作用 我们知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终到达我们写的代码中。那么中间件就是在应用程序管道中的一个组件,用来拦截请求过程进行一些其他处理和响应。中间件可以有很多个,每一个中间件都可以对管道中的请求进行拦截,它可以决定是否将请求转移给下一个中间件。 asp.net core 提供了IApplicationBuilder接口来让把中间件注册到asp.net的管道请求当中去

ASP.NET Core 中间件基本用法

╄→尐↘猪︶ㄣ 提交于 2020-01-02 02:35:44
ASP.NET Core 中间件 ASP.NET Core的处理流程是一个管道,而中间件是装配到管道中的用于处理请求和响应的组件。中间件按照装配的先后顺序执行,并决定是否进入下一个组件。中间件管道的处理流程如下图(图片来源于官网): 管道式的处理方式,更加方便我们对程序进行扩展。 使用中间件 ASP.NET Core中间件模型是我们能够快捷的开发自己的中间件,完成对应用的扩展,我们先从一个简单的例子了解一下中间件的开发。 Run 首先,我们创建一个ASP.NET Core 应用,在Startup.cs中有如下代码: app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); }); 这段代码中,使用Run方法运行一个委托,这就是最简单的中间件,它拦截了所有请求,返回一段文本作为响应。Run委托终止了管道的运行,因此也叫作 终端中间件 。 Use 我们再看另外一个例子: app.Use(async (context, next) => { //Do something here //Invoke next middleware await next.Invoke(); //Do something here }); 这段代码中,使用Use方法运行一个委托

新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序(续1)

为君一笑 提交于 2020-01-02 02:27:37
今天在 @张善友 和 @田园里的蟋蟀 的博客看到微软“.Net社区虚拟大会”dotnetConf2015的信息,感谢他们的真诚付出!真希望自已也能为中国的.NET社区贡献绵薄之力。   上周星期天开通了博客并发布了第一篇文章 《新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序》 ,汇集了一些比较流行的技术和开源项目,也把自己的程序架构、部分代码风格、前端表现简单做了一些展示,引起了近100位朋友的评论。特别感谢@田园里的蟋蟀、@深蓝医生、@郭明锋、@疯狂的提子、@jimcsharp、@以吾之名等给我建议和指导的朋友,也感谢那些给我支持和鼓励的朋友。还有对我提出批评的朋友,说我的面试题的内容不当,也很感谢他们让我更注意言辞,但并不会影响我对面试者基础知识的重视程度。   上周发布那篇文章主要是因为这段时间在招聘过程中发现几乎所有面试者对基础知识和新技术都知之甚少,有过几年工作经验的程序员也几乎只会单一模式的CURD,没有明显的技术特长,所以我想分享一些自己认为比较好的思想、技术、架构模式,引起更多ASP.NET程序员的思考和讨论。   其实,上周星期天是花了大半天写一篇博客,在发出来之前删掉了一大半内容(一些讲述我自己心路历程的内容),因为我在博客园是一个新人,在没有对别人提供价值帮助之前也许没人关心我是谁。那天由于时间太晚了,很多想写的内容都没有写出来

从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之八 || API项目整体搭建 6.3 异步泛型仓储+依赖注入初探

旧时模样 提交于 2020-01-02 01:58:43
本文3.0版本文章 本文涉及的内容,同样适用于3.0版本,不用修改。 回顾 1、Sqlsugar 的使用   在上文中,遇到了大家见仁见智的评论和批评,嗯~说实话,积极性稍微受到了一丢丢的打击,不过还好,还是有很多很多很多人的赞同的,所以会一直坚持下去,欢迎提出各种建议,问题,意见等,我这个系列呢,只是一个抛砖引玉的文章,大家可以自定义的去扩展学习,比如你看了.net core api,可以自学.net core mvc呀;看了sqlsugar,可以自学EFCore,Deppar呀;看了vue,可以自学React、Angular呀,我希望起到的是一个志同道合的作用,而不是情绪的宣泄场所。🌹   书接上文,《 框架之七 || API项目整体搭建 6.2 轻量级ORM 》,在文中,我们提到了Sqlsugar,该框架呢我也是咨询了身边的一些大佬,他们给我说法是: Sqlsugar 和 EFCore 一样,只是一个表达式树,不用写sql,但是支持sql,支持多种类型数据库(MSSQL,Oracle,Mysql,SQLite),配置简单; 仅仅是一个数据访问层,100k轻量级,方便迁移; 而且也要看自己公司需要,我司项目也用EFCore ,当然也有部分用的是 SqlSugar,不存在孰优孰劣;   关于速率呢,我简单的做了一个测试,使用公司的数据表,一共4千万条数据,我遍历全表

使用Quartz实现定时作业

岁酱吖の 提交于 2020-01-01 22:27:11
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇。 Quartz是一个开源的作业调度框架,准确的称谓应该是 Quartz.Net ,它是Java开源项目 Quartz Scheduler 的一部分。 关于Quartz的功能可访问 https://www.quartz-scheduler.net/features.html nuget地址: https://www.nuget.org/packages/Quartz/3.0.7/ GitHub地址: https://github.com/quartznet/quartznet 首先是对 定义的MyJobService 进行完善。 using System.Threading.Tasks; namespace Demo.MyJob { public class MyJobService { public async Task StartAsync() { //操作逻辑 } public async Task StopAsync() { //操作逻辑 } public async Task ContinueAsync() { //操作逻辑 } public async Task PauseAsync() { //操作逻辑 } } } 完善之后的代码如下 using System

tomcat解决打开html乱码

妖精的绣舞 提交于 2020-01-01 22:25:39
在 tomcat 的 web.xml中 放开默认注释的过滤器 < <filter> <filter-name>setCharacterEncodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <async-supported>true</async-supported> </filter> 来源: CSDN 作者: 只对你说爱℡ 链接: https://blog.csdn.net/JavaSeEe0123/article/details/103796039

Spring @Async 注解

﹥>﹥吖頭↗ 提交于 2019-12-30 17:44:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、 spring 在扫描bean的时候会扫描方法上是否包含@async的注解 如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。 spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。 我们可以关注到再配置task的时候,是有参数让我们配置线程池的数量的。 因为这种实现方法, 所以在同一个类中的方法调用,添加@Async注解是失效的 !原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用 2、spring为我们提供了AOP,面向切面的功能(和smartFrame AOP实现原理差不多) 他的原理和异步注解的原理是类似的,spring在启动容器的时候,会扫描切面所定义的类。 在这些类被注入的时候,所注入的也是代理类,当你调用这些方法的时候,本质上是调用的代理类。 通过代理类再去执行父类相对应的方法,那spring只需要在调用之前和之后执行某段代码就完成了AOP的实现了 来源: oschina

async用于申明function异步,await用于等待一个异步方法执行完成

末鹿安然 提交于 2019-12-30 04:03:08
先介绍async的用法: 1、async函数返回一个 Promise 对象 //一个普通函数 function getData(){ return "syy"; } console.log(getData()) //syy //加上async后 async function getData(){ return "syy"; } console.log(getData()); //Promise {<resolved>: "syy"} 2、async函数内部return语句返回的值,会成为then方法回调函数的参数 async function getData(){ return "syy"; } getData().then(data=>{ console.log(data) //syy }); 3、async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态,抛出的错误对象会被catch方法回调函数接收到 async function getData(){ throw new Error('出错了'); } getData() .then(v=>{ console.log(v) }) .catch(e=>{ console.log(e) //Error: 出错了 }); async function getData() { throw new Error(