异步控制器
- ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如
那些花费大量时间等待网络或数据库操作完成的请求仍能保持对其他请求的响应;所以异步主要是高效率而不是提高一个
单独请求的响应速度,尽管异步花费了与同步一样的事件响应用户请求,但在异步管道中,服务器不会因为在等待一个请求
的完成而阻塞其他有用的任务执行
- 理解异步和同步ASP.NET代码的区别
- 首先理解web服务器是如何处理请求的。IIS维护了一个用来服务请求的空闲线程的集合(线程池)。当一个请求进入时,
线程池中的一个线程就别调度用来处理进入的请求。当一个线程正在处理一个请求时,他就不能用来处理其他的请求,直到他
完成第一个请求的处理。IIS同时服务多个请求的能力是基于一个假设:线程池中有空闲的线程来处理进入的请求
- 阻塞线程
- 线程正在等待网络调用完成,因此不能用来执行当前请求的其他任务
- 线程饥饿
- 只要线程池足够大的话,阻塞线程并不是什么大问题;然而在处理多个并发请求的大型应用程序中,可能会因为请求的数量过多而导致
等待数据的请求也多而阻塞了大量的线程,从而导致线程池没有足够的空闲线程来处理新的请求
- 语法
public async Task<ActionResult> News(string city)
{
NewService newService=new NewService();
NewsModel news=await newsService.GetNews(city);
return View(news);
}
- 相比同步操作,只需做三处改动:为操作添加async修饰符,返回类型改为Task,在需要长时间运行的方法前添加await
EF的异步操作
- 增
- Add方法只是导致实体在内存中的修改,SaveChanges方法才是导致命令执行,所以SaveChanges要异步执行
- 删
- Find方法使查询被发送到数据库进行检索,所以Find方法要异步执行
- 查
- pageData语句只是设置为一个查询语句,并没有执行,直到调用.ToList才会将数据从数据库中
查询并加载在内存中,所以ToList方法要异步执行
- 改
- FirstOrDefault方法返回的是序列的第一个元素或默认值,是向数据库中发起了请求,所以
该方法要异步执行
同步or异步
- 同步
- 操作简单或者能在短时间内执行完毕
- 简单性和可测试性
- 操作是CPU密集型,而非IO密集型
- 异步
- 阻塞的操作
- 一种可以让用户取消长时间运行的请求的机制
- 操作是IO密集型,而非CPU密集型
以上内容部分摘抄自《ASP.NET MVC 5》
代码GitHub地址
|
请发表评论