WinRT異步機制的誕生背景git
當編寫一個觸控應用程序時,執行一個耗時函數,並通知UI更新,咱們但願全部的交互過程均可以作出快速的反應。流暢的操做感變的十分重要。github
在鏈接外部程序接口獲取數據,操做本地數據等任務時,若是構建方式錯誤,應用程序會將大量的時間花費等待外部環境上,從而沒法保證足夠的時間來響應用戶的需求。編程
以前公司的項目須要在Win7系統下編寫觸控應用程序,無論同事們如何努力的優化着代碼,都不能使操做體驗達到需求的要求。究其緣由,Win7與.NET Framework不是爲觸控而設計,在進行某些I/O操做時,系統內部下降的UI操做的優先級。windows
很高興的是,微軟適時的推出了WinRT,配合Win8,操做感爲之提高,至少不遜於Ios了。app
爲解決執行操做等待的環境問題,是微軟着手設計WinRT API的核心原則,其提供的API能保證觸控程序流暢運行的重要性不言而喻(爲了Surface,你們懂得)。異步
WinRT的內部機制async
WinRT對內部許多可能受輸入/輸出限制的 API 進行了異步化處理。若是執行時間超過50毫秒,那怕是同步編碼,也會進行異步化處理。異步編程
MS .Net Framework 4.5中增長了Task類,async/await關鍵字後,經過新機制可讓項目中異步操做變得十分簡單。函數
下面咱們就來深刻了解下這些新東西。優化
async/await示例
項目中最簡單的一個調用函數,該函數執行獲取某個特定文件夾的全部文件,即便在讀取階段,程序任然可以保持十分流暢的UI操做感。
1 async private void GetFile() 2 { 3 var files = await KnownFolders.PicturesLibrary.GetFilesAsync(); 4 this.DataContext = files; 5 }
「this.DataContext = files;」在GetFilesAsync執行完成後再被執行,經過async/await,異步調用以後的代碼將在於原始調用相同的上下文進行回撥。
能夠將操做結果通知UI更新,而無需擔憂返回到UI線程。
那麼WinRT是怎麼實現異步操做,它的異步基元的原理又是什麼?
WinRT異步編程五大核心接口
IAsyncInfo、IAsyncAction、IAsyncActionWithProgress、IAsyncOperation 和IAsyncOperationWithProgress。
WinRT 異步模型的核心接口依託於 IAsyncInfo 而構建。該接口能夠定義異步操做(例如,當前狀態、取消操做的功能和失敗操做的錯誤等)的屬性。
MSDN:戳
從IAsyncInfo的描述中所知,異步操做能夠返回結果和在運行時彙報進度,結合後面四種接口能夠定義不一樣的組合。下面引用MSDN上的一張經典圖片:
上圖用表格形式明瞭的表述了各個接口的用途。
本文的用例代碼實現:
1.IAsyncOperation的三種狀態示例:Canceled、Completed 和 Error,異步操做狀態Status;
2.實現IAsyncActionWithProgress彙報進度;
3.實現IAsyncOperationWithProgress彙報進度;
代碼就不貼了,示例代碼講的比較清楚,若有須要請自行下載:戳
請繼續關注Windows store app[Part 4]:深刻WinRT的異步機制