在WPF中開始Async的學習

 

簡介

Visual Studio中異步CTP (SP1刷新)的新功能預覽,讓你寫異步方案,只是比現在的.NET Framework的方法麻煩一點。 您可以編寫異步代碼,它與同步代碼看起來非常像,可以讓編譯器處理的回調函數。

本演練開始同步WPF應用程序查找並顯示在Netflix的目錄。 演練顯示如何更改使用的CTP功能的同步解決方案,以異步的解決方案。 

該應用程序使用打開數據協議(OData的)API來查詢,在您指定的年發行的電影Netflix的目錄。 有關OData的信息,請參閱Netflix website.。 

先決條件

爲了完成本演練,您必須安裝帶有SP1的Microsoft Visual Studio 2010 ,並安裝異步CTP在計算機上。

要打開異步CTP初始頁面

  1.  轉到我的文檔\ Microsoft Visual Studio中異步的CTP \文件。
  2. 雙擊Readme.hta。
  3. 或者,單擊開始  所有程序,Visual Studio的異步CTP,然後異步自述 

要測試一個應用程序的同步版本

  1. 在異步CTP初始頁面,請在C#VB入門入門部分在Visual Studio中打開項目。
  2. 按Ctrl + F5運行該應用程序。
  3. 出現下面的窗口。

  4. 發行年 “框中鍵入一年,然後單擊” 搜索 “按鈕。 應用程序搜索Netflix的目錄,在這一年發行的電影,顯示每個標題“框藝術”,並顯示匹配的總數。

  5. 輸入最近一年,然後再次單擊“ 搜索 ”按鈕。 請注意同步的解決方案中的下列行爲:
    • 顯示不改變,直到程序結束。 結果“面板不清零,顯示任何新的箱子藝術和搜索過程右上方狀況文本不報告分類彙總。 您會看到只在最後的冠軍數量。
    • 更糟糕的是,程序運行時,你不能操作它。 您不能調整大小,移動或最小化窗口,你不能滾動, 您不能使用關閉按鈕(在右上角的紅色區域中的X),以結束該程序,如果你厭倦了等待結果。 即使關閉Visual Studio中,沒有任何效果,這時候你需要等待
    • 如果Netflix的網站是出於某種原因,UI凍結,而程序等待時間,再次,你需要等待。

要啓動異步解決方案的轉換,增加了CTP的參考

  1. 項目菜單上,單擊添加引用  添加引用對話框。
  2. 在“ 瀏覽 ”選項卡,導航到異步CTP樣品的下載位置。 默認情況下,下載位置是我的文檔\ Microsoft Visual Studio中異步的CTP \ SAMPLES。
  3. 點擊AsyncCtpLibrary.dll“,然後單擊” 確定 “ “。

要轉換的代碼異步應用程序

正如你看到程序“,以測試一個應用程序的同步版本,”搜索應用程序,在指定的一年上映的電影的Netflix的目錄。 它顯示每個影片相關的框藝術。 箱子藝術是那部電影的Netflix的網頁鏈接。

在應用程序的兩種方法涉及從網上檢索信息,這些都是你需要改變轉換,從一個同步的解決方案異步解決方案的方法。

  • LoadMovies套舞臺上,然後反覆調用QueryMovies一次獲取XML數據,10(pageSize的變量的值)的電影。 它要求DisplayMovies顯示結果。
  • QueryMovies訪問Web檢索關於未來的10部電影信息。 從在結果中的每個條目,挑選出顯示使用領域:標題,URL,和箱子藝術。

下面的步驟轉換這兩個同步方法的異步方法。 當你做出每一個變化,一個錯誤信息引導您到​​下一個。

  1. MainPage.xaml中 ,在解決方案資源管理器右鍵單擊,然後單擊查看代碼以打開代碼編輯器中的代碼。
  2. QueryMovies是從官網上下載直接下載的,所以它是異步解決方案: 在Visual Basic中,單擊“ 全部 ”選項卡。 



    選擇最後一個,DownloadStringTaskAsync,異步,基於任務的異步CTP提供WebClient的擴展方法。 如果您沒有看到下拉列表的方法,只需鍵入它。
  3. 爲了使調用異步方法DownloadStringTaskAsync,你必須使QueryMovies成爲異步方法。 

    首先,在C#中添加await Await 在Visual Basic中,添加在DownloadStringTaskAsync的前面,如下面的代碼所示。
 
 // C# string data = await client.DownloadStringTaskAsync(new Uri(url)); 


 ' Visual Basic Dim data As String = Await client.DownloadStringTaskAsync(New Uri(url)) 


DownloadStringTaskAsync返回一個任務,並await 或者Await 任務。 您可以取代以前的單行分配與下面的兩行代碼進行轉換明確。

// C#
// This code is not part of the solution.
Task<string> theTask = client.DownloadStringTaskAsync(new Uri(url));
string data = await theTask;

' Visual Basic
' This code is not part of the solution.
Dim theTask As Task(Of String) = client.DownloadStringTaskAsync(New Uri(url))
Dim data As String = Await theTask

接下來,添加在Visual Basic中的QueryMovies定義在C#  async修飾符異步  您可以使用await 或者Await 關鍵字,立即封閉方法或lambda表達式包含async or Async 修飾符。

 
 // C# async Movie[] QueryMovies(int year,int first,int count) { var client = new WebClient(); 


 ' Visual Basic Async Function QueryMovies(year As Integer, first As Integer, count As Integer) As Movie() Dim client As New WebClient 


  1. 異步方法的返回類型必須void 任務,或在C# 中的任務<T>。 在Visual Basic中,方法必須是一個Sub ,或一個Function  ,返回Task Task (T)的。 在C#裏邊Movie[] Task<Movie[]> ,在VB裏邊是從Movie()Task(Of Movie())
 
 // C# async Task<Movie[]> QueryMovies(int year,int first,int count) 


 ' Visual Basic Async Function QueryMovies(year As Integer, first As Integer, count As Integer) As Task(Of Movie()) 


  1. 添加以下 using指令或Imports語句在代碼文件的頂部,以建立Task的任務定義。
 
 // C# using System.Threading.Tasks; 


 ' Visual Basic Imports System.Threading.Tasks 


  1. 按照慣例,異步方法應以“異步”結尾的名稱。 更改方法名稱QueryMovies QueryMoviesAsync。
 
 // C# async Task<Movie[]> QueryMoviesAsync(int year,int first,int count) 


 ' Visual Basic Async Function QueryMoviesAsync(year As Integer, first As Integer, count As Integer) As Task(Of Movie()) 


  1. QueryMovies轉換QueryMoviesAsync完成。 下一步,申請LoadMovies相同的過程,這就要求現在的異步方法QueryMoviesAsync。 對於這種方法,你不必改變返回值的類型,因爲該方法不返回一個有意義的值。

    首先,改變LoadMoviesQueryMovies QueryMoviesAsync調用的方法名稱。

 
 // C# var movies = QueryMoviesAsync(year,imageCount,pageSize); 


 ' Visual Basic Dim movies = QueryMoviesAsync(year,imageCount,pageSize) 


  1. 其次,因爲QueryMoviesAsync是一個異步方法,在C添加await  或Visual Basic中的Await 在前面的調用。
 
 // C# var movies = await QueryMoviesAsync(year,imageCount,pageSize); 


 ' Visual Basic Dim movies = Await QueryMoviesAsync(year,imageCount,pageSize) 


  1. 第三,增加異步異步修飾符的LoadMovies定義。
 
 // C# async void LoadMovies(int year) 


 ' Visual Basic Async Sub LoadMovies(year As Integer) 


  1. 最後,在C#中使用重構,重命名或在Visual Basic 改變 LoadMovies  LoadMoviesAsync 。
 
 // C# async void LoadMoviesAsync(int year) 


 ' Visual Basic Async Sub LoadMoviesAsync(year As Integer) 


這就是它! 你叫一個不同的WebClient方法,添加using指令 Imports語句,添加了幾個關鍵字,更名爲兩種方法,並修改了返回類型,和你有一個異步解決方案。

運行和測試程序

  1. 按Ctrl + F5運行該應用程序。
  2. 從程序重複步驟4和5的測試“,以測試一個應用程序的同步版本。” 注意改善異步行爲提供:
    • 結果不都發生在程序結束的同時。 例如,顯示面板的清除只要你點擊“ 搜索 ”按鈕,並框藝術是不是所有在同一時間顯示。 你首先看到的結果,只要你點擊“ 搜索 ”按鈕。
    • 您可以移動或調整窗口大小,或在滾動的過程,而運行。
    • 通過點擊“關閉”按鈕(在右上角的紅色區域中的X),您可以結束在任何時候搜索。
    • 在搜查過程中的進展情況的文字更新,顯示你有多少匹配的標題已經發現迄今。
    • 您可以單擊一個框的藝術形象,而無需等待整個搜索完成的那部電影的Netflix的頁面。
    • 最重要的是,如果Netflix的網站關閉,用戶界面​​保持響應。

異步CTP中引入的新功能,使你幾乎沒有疼痛的異步編程的所有優點。 你的代碼看起來仍然像同步碼,但無論你想,你可以指定異步行爲 - ,你可以做一個簡單,直觀的方式。

白皮書,語言規範,博客條目,包含更多的信息的鏈接,請參見異步編程對C#和Visual Basic或異步CTP初始頁面的文檔部分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章