簡介
在Visual Studio中異步CTP (SP1刷新)的新功能預覽,讓你寫異步方案,只是比現在的.NET Framework的方法麻煩一點。 您可以編寫異步代碼,它與同步代碼看起來非常像,可以讓編譯器處理的回調函數。
本演練開始同步WPF應用程序查找並顯示在Netflix的目錄。 演練顯示如何更改使用的CTP功能的同步解決方案,以異步的解決方案。
該應用程序使用打開數據協議(OData的)API來查詢,在您指定的年發行的電影Netflix的目錄。 有關OData的信息,請參閱Netflix
website.。
先決條件
爲了完成本演練,您必須安裝帶有SP1的Microsoft Visual Studio 2010 ,並安裝異步CTP在計算機上。
要打開異步CTP初始頁面
- 轉到我的文檔\ Microsoft Visual Studio中異步的CTP \文件。
- 雙擊Readme.hta。
- 或者,單擊開始 , 所有程序,Visual Studio的異步CTP,然後異步自述 。
要測試一個應用程序的同步版本
- 在異步CTP初始頁面,請在C#或VB的入門入門部分在Visual Studio中打開項目。
- 按Ctrl + F5運行該應用程序。
-
出現下面的窗口。
-
在發行年 “框中鍵入一年,然後單擊” 搜索 “按鈕。 應用程序搜索Netflix的目錄,在這一年發行的電影,顯示每個標題“框藝術”,並顯示匹配的總數。
-
輸入最近一年,然後再次單擊“ 搜索 ”按鈕。 請注意同步的解決方案中的下列行爲:
- 顯示不改變,直到程序結束。 結果“面板不清零,顯示任何新的箱子藝術和搜索過程右上方狀況文本不報告分類彙總。 您會看到只在最後的冠軍數量。
- 更糟糕的是,程序運行時,你不能操作它。 您不能調整大小,移動或最小化窗口,你不能滾動, 您不能使用關閉按鈕(在右上角的紅色區域中的X),以結束該程序,如果你厭倦了等待結果。 即使關閉Visual Studio中,沒有任何效果,這時候你需要等待。
- 如果Netflix的網站是出於某種原因,UI凍結,而程序等待時間,再次,你需要等待。
要啓動異步解決方案的轉換,增加了CTP的參考
- 在項目菜單上,單擊添加引用 。 添加引用對話框。
- 在“ 瀏覽 ”選項卡,導航到異步CTP樣品的下載位置。 默認情況下,下載位置是我的文檔\ Microsoft Visual Studio中異步的CTP \ SAMPLES。
- 點擊AsyncCtpLibrary.dll“,然後單擊” 確定 “ “。
要轉換的代碼異步應用程序
正如你看到程序“,以測試一個應用程序的同步版本,”搜索應用程序,在指定的一年上映的電影的Netflix的目錄。 它顯示每個影片相關的框藝術。 箱子藝術是那部電影的Netflix的網頁鏈接。
在應用程序的兩種方法涉及從網上檢索信息,這些都是你需要改變轉換,從一個同步的解決方案異步解決方案的方法。
- LoadMovies套舞臺上,然後反覆調用QueryMovies一次獲取XML數據,10(pageSize的變量的值)的電影。 它要求DisplayMovies顯示結果。
- QueryMovies訪問Web檢索關於未來的10部電影信息。 從在結果中的每個條目,挑選出顯示使用領域:標題,URL,和箱子藝術。
下面的步驟轉換這兩個同步方法的異步方法。 當你做出每一個變化,一個錯誤信息引導您到下一個。
- MainPage.xaml中 ,在解決方案資源管理器右鍵單擊,然後單擊查看代碼以打開代碼編輯器中的代碼。
-
QueryMovies是從官網上下載直接下載的,所以它是異步解決方案: 在Visual
Basic中,單擊“ 全部 ”選項卡。
選擇最後一個,DownloadStringTaskAsync,異步,基於任務的異步CTP提供WebClient的擴展方法。 如果您沒有看到下拉列表的方法,只需鍵入它。 -
爲了使調用異步方法DownloadStringTaskAsync,你必須使QueryMovies成爲異步方法。
首先,在C#中添加await 或Await 在Visual Basic中,添加在DownloadStringTaskAsync的前面,如下面的代碼所示。
|
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 修飾符。
|
- 異步方法的返回類型必須是 void ,任務,或在C# 中的任務<T>。 在Visual Basic中,方法必須是一個Sub ,或一個Function ,返回Task 或Task (T)的。 在C#裏邊從Movie[] 到Task<Movie[]> ,在VB裏邊是從Movie() 到Task(Of Movie()) 。
|
- 添加以下 using指令或Imports語句在代碼文件的頂部,以建立Task的任務定義。
|
- 按照慣例,異步方法應以“異步”結尾的名稱。 更改方法名稱QueryMovies QueryMoviesAsync。
|
-
QueryMovies轉換QueryMoviesAsync完成。 下一步,申請LoadMovies相同的過程,這就要求現在的異步方法QueryMoviesAsync。 對於這種方法,你不必改變返回值的類型,因爲該方法不返回一個有意義的值。
首先,改變LoadMovies從QueryMovies QueryMoviesAsync調用的方法名稱。
|
- 其次,因爲QueryMoviesAsync是一個異步方法,在C#添加await 或Visual Basic中的Await 在前面的調用。
|
- 第三,增加異步或異步修飾符的LoadMovies定義。
|
- 最後,在C#中使用重構,重命名或在Visual Basic 改變 LoadMovies 到 LoadMoviesAsync 。
|
這就是它! 你叫一個不同的WebClient方法,添加using指令或 Imports語句,添加了幾個關鍵字,更名爲兩種方法,並修改了返回類型,和你有一個異步解決方案。
運行和測試程序
- 按Ctrl + F5運行該應用程序。
-
從程序重複步驟4和5的測試“,以測試一個應用程序的同步版本。” 注意改善異步行爲提供:
- 結果不都發生在程序結束的同時。 例如,顯示面板的清除只要你點擊“ 搜索 ”按鈕,並框藝術是不是所有在同一時間顯示。 你首先看到的結果,只要你點擊“ 搜索 ”按鈕。
- 您可以移動或調整窗口大小,或在滾動的過程,而運行。
- 通過點擊“關閉”按鈕(在右上角的紅色區域中的X),您可以結束在任何時候搜索。
- 在搜查過程中的進展情況的文字更新,顯示你有多少匹配的標題已經發現迄今。
- 您可以單擊一個框的藝術形象,而無需等待整個搜索完成的那部電影的Netflix的頁面。
- 最重要的是,如果Netflix的網站關閉,用戶界面保持響應。
異步CTP中引入的新功能,使你幾乎沒有疼痛的異步編程的所有優點。 你的代碼看起來仍然像同步碼,但無論你想,你可以指定異步行爲 - ,你可以做一個簡單,直觀的方式。
白皮書,語言規範,博客條目,包含更多的信息的鏈接,請參見異步編程對C#和Visual Basic或異步CTP初始頁面的文檔部分。