使用ASP.NET MVC Futures 中的異步Action_.Net教程
推薦:注意ADO.NET中容易混淆的概念一、DataTable DataTable表示內存中數據的一個表,它完全是在內存中的一個獨立存在,包含了這張表的全部信息。DataTable可以是從通過連接從數據庫中讀取出來形成的一個表,一旦將內容讀到DataTable中,此DataTable就可以跟數據源斷開而獨立存在;也可以是完
在ASP.NET MVC中使用異步是比較麻煩的,從RC1版開始ASP.NET MVC Futures中提供了幾個支持異步的類。
相關的類有:AsyncActionDescriptor、AsyncController、AsyncControllerActionInvoker、AsyncManager、AsyncResultWrapper、AsyncTimeoutAttribute、NoAsyncTimeoutAttribute。
相關接口有:IAsyncActionDescriptor、IAsyncActionInvoker、IAsyncController、IAsyncManagerContainer。
下面講解一下怎么用它們
一、使用異步Action前的準備工作
1.引用Microsoft.Web.Mvc。
2.先要將要異步處理的Url交由MvcHttpAsyncHandler處理,這一步可以由AsyncRouteCollectionExtensions.MapAsyncRoute來設置規則,將原MapRoute處理的規則改為MapAsyncRoute,如:
routes.MapAsyncRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
3.將相應的Controller繼承于AsyncController。
public class HomeController : AsyncController { }
4.我們約定以下定義的Action都在HomeController中
二、第一種異步Action方式:Action、ActionCompleted方式
ASP.NET MVC Futures支持按名稱自動尋找異步Action的方法
其使用方法為:
public void Async1(){
//主線程
}
public ActionResult Async1Completed(){
//自動尋找與主線程 Action名稱 Completed 的Action 做為異步Action
return Content("Async1");}
三、第二種異步Action方式:BeginAction、EndAction方式
如果第一種方式你了解了的話第二種自然也不在話下,不過這種方式是與其它類的異步調用一起使用。
public delegate void AsyncEventHandler();//這里聲明了一個委托,//也可使用
WebRequest/WebResponse/SqlConnection來實現這個異步過程
public void Event1(){}
public IAsyncResult BeginAsync3(AsyncCallback callback, object state){
AsyncEventHandler asy = new AsyncEventHandler(Event1);
ViewData["a"]=asy;//這里在方法間傳值必須使用輔助存儲對象,第一種方法中也是一樣
return asy.BeginInvoke(callback, state);
}
public void EndAsync3(IAsyncResult result){
//轉到異步的Action中
var a = ViewData["a"] as AsyncEventHandler;
a.EndInvoke(result);
Content("完成").ExecuteResult(this.ControllerContext);
}
四、第三種異步Action方式:使用AsyncManager.RegisterTask及委托
如果感覺上面使用2個方法才能實現異步Action有些麻煩的話(也的確是麻煩),可以使用AsyncManager.RegisterTask來調用委托來實現異步調用。
public void Async2(){
this.AsyncManager.RegisterTask(c => {
//主線程,調用異步線程
c(null);
}, delegate(IAsyncResult result) {
//異步部分
Content("Async2").ExecuteResult(this.ControllerContext);
});
}
其實無論是哪種方法都感覺不太完美,我個人覺得Action/ActionCompleted的方法可能更優美一點,適合一般使用(只是這三個比較)。只是AsyncManager.RegisterTask的方法傳值方便一點,而Begin/End方法更適合與其它異步的操作配合。
分享:解析asp.net開發與web標準的沖突問題Visual Studio .net從2003到現在的2008,一路走來慢慢強大從以前的vs2003能自動改亂你的html代碼到現在在vs2008中都能直接對html代碼進行w3c標準驗證并提示了,非常不易。 論壇中也經常有從事.net開發的新手朋友問一些ASP.net開發過程中與Web標準之間的沖突
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-使用ASP.NET MVC Futures 中的異步Action。