ASP.NET非同步處理

來源:互聯網
上載者:User

要想瞭解asp.net 2.0的非同步頁的處理過程,先列出頁面的生命週期:

1 :Init 事件: 頁面初始化,初始化設定。

2: LoadViewState方法:載入檢視狀態, 填充ViewState屬性。

3 :LoadPostData方法: 處理回傳資料,處理傳入表單資料。

4: Load 事件: 載入頁面,頁面控制項初始化完成並反映了用戶端的資料。

5 :RaisePostDataChangedEvent方法: 回傳更改通知 引發變更事件。

6 :RaisePostBackEvent方法:處理回傳事件 ,處理引起回傳的用戶端事件,並在服務上引發相應時間。

7: PreRender事件: 頁面預呈現。

8 :SaveViewState方法:儲存檢視狀態, 將ViewState屬性儲存到字串中。

9 :Render方法: 呈現頁面 。

10: Dispose方法:處置是否對昂貴資源的引用。

11 :Unload事件: 卸載頁面 。

頁面處理方式:

1:同步處理;

2:非同步處理。

   同步請求過程:

1:ASP.NET 收到頁面請求時,從線程池中提取一個線程並將請求分配給該線程。

2:頁在該請求期間保留線程,防止該線程用於處理其他請求。

3:如果一個同步請求需要運算時間較長,此時分配給該請求的線程在調用返回之前處於掛起狀態。

4:等待線程返回後完成頁面的其它生命週期。

同步請求的問題

線程池的可用線程是有限的,如果此時請求過多,ASP.NET 因 503“Server Unavailable”錯誤使後續請求失敗。這讓asp.net能夠接收的請求量會大大減少,影響了延展性。

非同步處理過程:

前面的兩點和普通同步請求一樣,不同的是對於比較費時的過程的處理方式:

1:一個非同步作業開始響應 ASP.NET 的訊號之後,該線程返回線程池。

2:ASP.NET 調用使用 AddOnPreRenderCompleteAsync 註冊的 Begin 方法。Begin 方法的任務是啟動諸如資料庫查詢或 Web 服務調用的非同步作業,並立即返回。

3:線程返回到線程池。同時,Begin 方法返回 IAsyncResult。

4: ASP.NET 從線程池提取線程並調用 End 方法。

5:當 End 返回之後,ASP.NET 執行該頁生命週期其餘的部分。

非同步優勢:

線程池線程得到了高效的使用,提高了延展性。原來掛起等待的線程現在可用於服務其他請求。

非同步載入資料的樣本:

第一步:讓頁面支援非同步。設定Async屬性。

第二步:因為是操作資料庫,想讓資料庫支援非同步,需要對資料庫連接串進行配置。

Asynchronous Processing=true。

第三步:在頁面的Page_Load事件中註冊非同步事件。

 

代碼

protected void Page_Load(object sender, EventArgs e)
{
AddOnPreRenderCompleteAsync(
new BeginEventHandler(BeginAsyncOperation),
new EndEventHandler(EndAsyncOperation)
);
}
IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state)
{
string sql = "SELECT TOP 10 * FROM dbo.Card_Ext";

SqlConnection _conn = new SqlConnection(ConfigurationManager.

AppSettings["DataAccessContionStringRead"].ToString());

_conn.Open();
SqlCommand cmd = new SqlCommand(sql, _conn);

IAsyncResult rIsynResult = cmd.BeginExecuteReader(cb, cmd,

CommandBehavior.CloseConnection);

return rIsynResult;
}
void EndAsyncOperation(IAsyncResult IResult)
{
if (!IResult.IsCompleted)
{
IResult.AsyncWaitHandle.WaitOne();
}
else
{
SqlDataReader dr = (IResult.AsyncState as SqlCommand).EndExecuteReader(IResult);
if (!dr.IsClosed)
{
List<string> _list = new List<string>();
while (dr.Read())
{
_list.Add(dr[0].ToString());
}
this.GridView1.DataSource = _list;
this.GridView1.DataBind();
}
dr.Close();
}
}

.Net下比較常用的非同步處理情境:

1:FileStream,即我們常說的I/O操作:

2:Socket;

3:SqlCommand,例如:BeginExecuteReader、BeginExecuteNonQuery。

4:WebRequest,像抓取網頁等操作;

5:WebServcie的調用。

非同步呼叫應該注意的地方:

下面的程式也是合法的。這種方式雖然也是非同步呼叫,但是和同步調用效果一樣,因為EndExecuteReader方法會讓當前線程掛起,直到返回結果。從效能角度和資源上講,比直接用同步效果更差,因為系統要多啟動一個線程。比較好的做法就是採用回調方式,具體做法可以參考上面的代碼。

cmd.BeginExecuteReader(CommandBehavior.CloseConnection);
cmd.EndExecuteReader(rIsynResult);

asp.net非同步頁面與ajax非同步效果區別:

1:asp.net的非同步頁面讓我第一想法是和ajax效果比較,ajax應用在比較費時的方法上,當資料載入時,在頁面顯示資料的地區先用一段提示文字,例如:資料正在載入中...之類的,無論這個方法多麼費時,它隻影響這一塊的資料顯示,頁面其它地區不受影響(如果速度不慢的話)。而asp.net非同步頁面並不能達到這種效果,從上面的非同步執行流程圖可以看出,非同步呼叫的事件發生在OnPreRenderComplete中,就是說在頁面中生命週期之內,頁面要想完全呈現給使用者,必須等待非同步方法呼叫返回結果。例如,一個費時的非同步IO方法,需要費時10S,那麼使用者要想看到頁面,起碼在10S以上。

2:非同步頁面增加的是處理請求的數量,線程池線程得到了高效的使用,提高了延展性,而ajax是在頁面載入完成之後根據返回結果調用回呼函數操作DOM完成資料載入。
       非同步任務:

ASP.NET 2.0 中引入了另一個方法來簡化非同步作業: RegisterAsyncTask,比 AddOnPreRenderCompleteAsync 具有以下優勢。
            1:除了 Begin 和 End 方法,RegisterAsyncTask 允許註冊當非同步作業長時間無法完成時調用的逾時方法。設定 @ Page 指令中 AsyncTimeout 屬性設定逾時。
            2:可以在一個請求中多次調用 RegisterAsyncTask 來註冊若干非同步作業。
            3:可以使用 RegisterAsyncTask 的第四個參數將狀態傳遞給 Begin 方法。這個參數一般設定為null。

RegisterAsyncTask 的非同步頁與依賴於 AddOnPreRenderCompleteAsync 的非同步頁相類似。需要將該頁的 AsyncMode 屬性設定為 true,且與通過 PreRender 事件執行,此時調用使用 RegisterAsyncTask 註冊的 Begin 方法,而不是AddOnPreRenderCompleteAsync ,而且進一步保持請求處理直到最後一個操作完成。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.