之前看過老趙這兩篇文章。也研究了一下老趙異步的實作方式。
不過感覺自己擴充的話,在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>