一直认为异步效率比同步要好,今天看了下其实不是所有需求都适用于异步,啥时候用同步异步如下:
满足以下条件时使用同步管线:
1,操作很简单或运行时间很短。
2,简单性比效率更重要。
3,此操作主要是 CPU 操作而不是包含大量的磁盘或网络开销的操作。 对 CPU 绑定操作使用异步操作方法未提供任何好处并且还导致更多的开销。
在满足以下条件时使用异步管线:
1,操作是网络绑定的或 I/O 绑定的而不是 CPU 绑定的。
2,测试显示阻塞操作对于网站性能是一个瓶颈,并且通过对这些阻塞调用使用异步操作方法,IIS 可对更多的请求提供服务。
3,并行性比代码的简单性更重要。
4,您希望提供一种可让用户取消长时间运行的请求的机制
在使用异步操作的时候需要占用更多的资源,因为一个线程在理论上好像是2m,如果在在整个应用程序中用异步太多将会出现内存不足,从而出现503错误(服务器正忙),所以在使用异步的时候也要慎用,假如一定要是用也是为了在程序中增加性能等,参照上序何时使用同步与异步
在asp.net mvc中使用异步控制器:
控制器继承AsyncController ,AsyncController拥有所有Controller的特性,所以在控制器中AsyncController同样可以实现同步,实现异步的action需要以xxxAsync开始,以xxxComleted呈现给页面,视图命名为xxx.aspx,也不是xxxAsync.aspx,更同步命名是一样的
public class HomeController : AsyncController { public void IndexAsync() { AsyncManager.OutstandingOperations.Increment(2);//两个异步 AsyncManager.Parameters["name"] = "objectboy"; AsyncManager.OutstandingOperations.Decrement(); AsyncManager.Parameters["age"] = "25"; AsyncManager.OutstandingOperations.Decrement(); } public ActionResult IndexCompleted(string name,string age) { return Content(name+age); } }
AsyncManager: 为AsycController 类提供异步操作。
OutstandingOperations:获取未完成操作的数目。
我的事例上通过Parameters的形式传递值,将name,age两个参数传递给xxxCompleted呈现,运行后结果为 :objectboy25