為避免長時間運作凍結 UI 執行緒,Windows 8 應用程式開發必須善用非同步程式設計。本文以 C#/XAML 範例示範如何使用 async / await 關鍵字,在點擊「Get Blogs」按鈕時非同步取得 Windows Blog RSS 饋送,期間 UI 保持回應,可同時點擊「Change Text」按鈕修改文字內容。
<StackPanel Orientation="Horizontal" Grid.Row="1">
<StackPanel>
<TextBlock x:Name="listTitle" Height="40" Width="200" Style="{StaticResource BasicTextStyle}"/>
<ListView x:Name="blogList" ItemTemplate="{StaticResource listTemplate}"
VerticalAlignment="Top" HorizontalAlignment="Left" Height="550"
Margin="50,10,0,0" Width="650"/>
</StackPanel>
<StackPanel Orientation="Vertical" VerticalAlignment="Top">
<TextBlock x:Name="waitingText" Height="40" Width="200" Style="{StaticResource BasicTextStyle}" />
<Button x:Name="getBlogs" Content="Get Blogs" Width="150" Click="getBlogs_Click" />
<Button x:Name="changeText" Content="Change Text" Margin="0,10,0,0" Width="150" Click="changeText_Click" />
</StackPanel>
</StackPanel>
private async void getBlogs_Click(object sender, RoutedEventArgs e) {
waitingText.Text = "Loading Blogs...";
SyndicationClient client = new SyndicationClient();
client.BypassCacheOnRetrieve = true;
Uri feedUri = new Uri("https://windowsteamblog.com/blogs/developers/rss.aspx");
try {
SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri);
ObservableCollection<BlogItem> blogData = new ObservableCollection<BlogItem>();
listTitle.Text = feed.Title.Text;
foreach (SyndicationItem item in feed.Items) {
blogData.Add(new BlogItem() {
Author = item.Authors[0].Name.ToString(),
PubDate = item.PublishedDate.Year + "/" + item.PublishedDate.Month + "/" + item.PublishedDate.Day,
Title = item.Title.Text
});
}
blogList.ItemsSource = blogData;
waitingText.Text = "Completed!";
} catch (Exception ex) {
waitingText.Text = "Cant load the page: " + ex.ToString();
}
}
private void changeText_Click(object sender, RoutedEventArgs e) {
waitingText.Text = "Please Waiting...";
}




async 修飾方法,表示方法包含非同步作業。await 運算子暫停方法執行直到等待的 Task 完成,**不阻塞呼叫執行緒**。SyndicationClient.RetrieveFeedAsync 回傳 Task<SyndicationFeed>,適用 await。try/catch 中,避免未觀察到的例外導致應用程式終止。同樣模式適用於檔案 I/O、網路請求、資料庫存取、感測器資料讀取等長時間作業。Windows Runtime 提供大量 *Async 方法,配合 async/await 撰寫流暢非同步程式碼。