APM (非同步編程模型)
來源:互聯網
上載者:User
最近有一個功能,要在一個頁面現實一些統計資料,這些資料分布在3台伺服器的不同資料庫裡,這個頁面會比較頻繁的被訪問,我用平常的方式處理,發現速度比較慢,只好想別的方法來解決,我想起了以前寫的 ADO.NET的新功能:MARS(Multiple Active Result Set) 及 非同步執行命令 這篇文章,我認為在這種情況下用非同步去處理是個不錯的主意,測試後發現速度確實快多了,如是修改類庫加上非同步執行的方法,並且我決定修改日誌類庫裡加上相關非同步執行的方法,寫記錄檔和發郵件使用非同步方式執行。
.Net Framework 2.0增加了很多非同步執行的方法,SqlCommad 增加了BeginExecuteNonQuery,EndExecuteNonQuery,BeginExecuteReader,EndExecuteReader,BeginExecuteXmlReader,EndExecuteXmlReader方法,另外,Stream類,WebRequest類等也增加了相關非同步執行方法,這些方法都也Begin,End開頭的,這些方法都是返回一個IAsyncResult對象,這個對象裡有一個AsyncState屬性,這個屬性很重要,因為可以通過這個屬性傳遞任何我們想傳遞的對象。這些實際上是非同步編程模型(APM -- Asynchronous Programming Model)。
APM支援以下三種方式:wait-until-done,polling,method callback
但調用一系列BeginXX方法後,這些方法都會請求操作排隊然後返回IAsyncResult對象來標識擱置動作,如果非同步作業完成,調用EndXX方法時可以得到返回結果。
wait-until-done(等待直到完成): 如果有非同步作業未完成,EndXX方法將會掛起調用線程。
polling(輪詢):為了實現輪詢,會有一個線程定時的詢問CLR來擷取非同步請求執行狀態。這時IAsyncResult介面的AsyncWaitHandle和IsCompleted屬性就派上用場了。
method callback(回調方法):任何一個非同步請求執行完畢馬上調用指定的回調方法。
我認為回調方法是效率最好的,因為使用這種方式不會將一個線程置於等待狀態(wait-until-done),也不會讓一個線程週期性去詢問CLR來擷取非同步請求執行狀態。