asp.net 2.0的異步頁面刷新功能真得很酷,今天嘗試用它解決我的一個應用問題,真是幫了大忙了。
我的頁面要向后臺的socket服務提交一個查詢,首先這是一個可能長時間不返回的操作;其次為了拿到socket服務返回的長度不定、有可能很大的response數(shù)據(jù),我不得不采用了dotnet的iasyncresult beginreceive(byte[] buffer, int offset, int size, socketflags socketflags, asynccallback callback, object state);辦法來異步提交socket命令,然后在回調函數(shù)中迭代調用int endreceive(iasyncresult asyncresult);來獲取response數(shù)據(jù)直到數(shù)據(jù)被取完,這一系列的數(shù)據(jù)片斷都緩存在一個memoryblock鏈表中。
這種情況下,asp.net頁面要想用表格展示response數(shù)據(jù),必須能夠被異步刷新。
asp.net 1.x 本質上不支持異步頁,但是通過堅韌的努力和不懈地創(chuàng)新可以生成異步頁。有關更多概述信息,請參閱 msdn®magazine 2003 年 6 月刊的文章“use threads and build asynchronous handlers in your server-side web code”,該文章的作者是 fritz onion。
但asp.net 2.0 極大地簡化了生成異步頁的方式。首先使用該頁的 @ page 指令引入 async=“true” 屬性。
其次,在 page_load 時,注冊事件page_prerender:
private void page_load(object sender, system.eventargs e)
{
if (!ispostback)
{
// 注冊事件page_prerender執(zhí)行完成時執(zhí)行方法
// hook prerendercomplete event for data binding
this.prerendercomplete += new eventhandler(page_prerendercomplete);
接下來,我在點擊按鈕的事件函數(shù)中,開始我的異步操作之旅:
/// pageasynctask 的方式則是增強版本,除了異步頁面處理開始和結束方法自身外,
/// 還可以提供在超時情況下的處理方法,以及處理時的狀態(tài)對象。
///
pageasynctask task = new pageasynctask(
new begineventhandler(beginsubmitkeywordsasyncoperation),
new endeventhandler(endsubmitkeywordsasyncoperation),
new endeventhandler(timeoutsubmitkeywordsasyncoperation),
null
);
registerasynctask(task);
/// 對大多數(shù)簡單的異步處理情況,可以直接調用addonprerendercompleteasync 方法,
/// 提交頁面請求開始和結束時的處理代碼
//addonprerendercompleteasync(
// new begineventhandler(beginsubmitkeywordsasyncoperation),
// new endeventhandler(endsubmitkeywordsasyncoperation)
//);
該頁經(jīng)歷其常規(guī)處理生命周期,直到 prerender 事件剛剛引發(fā)之后。然后,asp.net 調用使用 registerasynctask注冊的 begin 方法beginsubmitkeywordsasyncoperation。這個方法中我將向sokcet服務提交我的命令,然后將socket.beginreceive方法得到的iasyncresult對象返回給asp.net。
然后,我的socket異步回調函數(shù)在最終全部獲得數(shù)據(jù)流后,通過調用
callback.invoke(result);
來通知頁面socket這邊已經(jīng)完成工作了。
于是asp.net喚起endsubmitkeywordsasyncoperation方法:
/// <summary>
/// 異步調用結束后的接收方法(異步操作執(zhí)行完成后,會重新從線程池中取個線程為本頁面請求服務).
/// </summary>
/// <param name="ar"></param>
void endsubmitkeywordsasyncoperation(iasyncresult ar)
{
_resultdataset = _submit.getresultdataset(ar);
在這個函數(shù)中,我就可以拿到數(shù)據(jù)流了。
之后,asp.net又喚起page_prerender事件,從而可以在這個事件中,把頁面上的表格正確填充了。
這樣,就達到了我的目的。而且向后臺提交后等待被再度激活超時了,也可以由
void timeoutsubmitkeywordsasyncoperation(iasyncresult ar)
來做合適的處理。
參考資源:
1:
asp.net 2.0 中的異步頁
http://www.microsoft.com/china/msdn/library/webservices/asp.net/issueswickedcodetoc.mspx?mfr=true
發(fā)布日期: 2006-4-19 | 更新日期: 2006-4-19
2:
新聞熱點
疑難解答
圖片精選