asp.net mvc3 异步Controller

一直认为异步效率比同步要好,今天看了下其实不是所有需求都适用于异步,啥时候用同步异步如下:  

满足以下条件时使用同步管线:

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

posted @ 2013-05-04 20:44  等待是一生最初的苍老  阅读(2572)  评论(3编辑  收藏  举报