2011-05-05 67 views
6

在ASP.NET MVC 2個異步控制器,我們可以做這樣的事情:在ASP.NET MVC 2異步控制器中,動作過濾器是否異步執行?

public class SomeController : AsyncController 
{ 
    [Blurb] 
    public void FooAsync() 
    { 
     this.AsyncManager.OutstandingOperations.Increment(); 

     Task.Factory.StartNew(
      () => 
      { 
       this.AsyncManager.Parameters["result"] = new BazResult(); 
       this.AsyncManager.OutstandingOperations.Decrement(); 
      }); 
    } 

    public ActionResult FooCompleted(ActionResult result) 
    { 
     return result; 
    } 
} 

我的問題是,它的行爲過濾「的Blurb」在這種情況下異步執行?換句話說,它的同步特性是否被自動包裝成異步調用?

回答

2

我看了一下AsyncControllerActionInvoker的封面,它看起來確實將它們包裝成一組異步調用和延續。它打電話給BeginInvokeActionMethodWithFilters然後設置InvokeActionMethodFilter異步

對於那些好奇的人來說,源代碼就是codeplex。

+0

所以過濾器在另一個線程上執行? BeginInvoke不使用線程池線程嗎?這不是打敗異步電話的目的嗎? – 2011-05-05 20:55:27

+0

我的理解是,異步調用不使用Web請求使用的相同線程池,所以IIS不會面臨線程匱乏。 – 2011-05-05 20:57:21