天天看點

使用ASP.NET MVC Futures 中的異步Action

之前看過老趙這兩篇文章。也研究了一下老趙異步的實作方式。

不過感覺自己擴充的話,在ASP.NET MVC中使用異步還真是麻煩,剛好看到從RC1版開始 ASP.NET MVC Futures中提供了幾個支援異步的類。

相關的類包括<b>AsyncActionDescriptor、AsyncController、AsyncControllerActionInvoker、AsyncManager、AsyncResultWrapper、AsyncTimeoutAttribute、NoAsyncTimeoutAttribute,</b>相關接口有<b>IAsyncActionDescriptor、IAsyncActionInvoker、IAsyncController、IAsyncManagerContainer。</b>

下面說一下怎麼用它們

1.引用Microsoft.Web.Mvc。    

2.先要将要異步處理的Url交由MvcHttpAsyncHandler處理,這一步可以由AsyncRouteCollectionExtensions.MapAsyncRoute來設定規則,将原MapRoute處理的規則改為MapAsyncRoute,如:

3.将相應的Controller繼承于AsyncController。

4.我們約定以下定義的Action都在HomeController中

ASP.NET MVC Futures支援按名稱自動尋找異步Action的方法

<a href="/Home/Async1">Url:/Home/Async1</a>

其使用方法為

如果第一種方式你了解了的話第二種自然也不在話下,不過這種方式是與其它類的異步調用一起使用。

<a href="/Home/Async2">Url:/Home/Async2</a>

如果感覺上面使用2個方法才能實作異步Action有些麻煩的話(也的确是麻煩),可以使用AsyncManager.RegisterTask來調用委托來實作異步調用。

<a href="/Home/Async3">Url:/Home/Async3</a>

其實無論是哪種方法都感覺不太完美,我個人覺得Action/ActionCompleted的方法可能更優美一點,适合一般使用(隻是這三個比較)。隻是AsyncManager.RegisterTask的方法傳值友善一點,而Begin/End方法更适合與其它異步的操作配合。

當然本文還有肯定還有好多地方沒有講到,包括其它的異步調用方式還有Filter,是以希望朋友們多多讨論。

附老趙2個文章

<a href="/JeffreyZhao/archive/2009/02/02/extend-asp-net-mvc-for-asynchronous-action.html">為ASP.NET MVC擴充異步Action功能(上)</a>

<a href="/JeffreyZhao/archive/2009/02/04/extend-asp-net-mvc-for-asynchronous-action-2.html">為ASP.NET MVC擴充異步Action功能(下)</a>