Windows store app[Part 3]:認識WinRT的異步機制

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的異步機制

相關文章
相關標籤/搜索