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來擷取非同步請求執行狀態。   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.