桌面或 Web 應用執行耗時操作(網路請求、檔案 I/O、複雜運算)時,若在 UI 執行緒同步阻塞,介面將凍結無回應。非同步模式讓耗時邏輯在背景執行,UI 執行緒保持響應,使用者可繼續操作其他功能。
介面包含:
• 「Get Blogs」按鈕:觸發非同步抓取
• 「Change Text」按鈕:驗證 UI 執行緒未阻塞
• waitingText:顯示狀態文字
• blogList:顯示抓取結果
<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/atom.aspx"); // 範例 RSS
try
{
// await 關鍵字:非同步等待,不阻塞 UI 執行緒
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 = "Can't load the page: " + ex.ToString();
}
}
private void changeText_Click(object sender, RoutedEventArgs e)
{
waitingText.Text = "Please Waiting...";
}

非同步啟動,顯示 Loading Blogs...

非同步期間 UI 仍可互動,Change Text 生效

非同步完成,顯示 Completed! 並填入資料
RetrieveFeedAsync)。非同步模式同樣適用於 JavaScript (WinJS.Promise)、VB.NET。更多進階主題:平行非同步 (Task.WhenAll)、進度回報 (IProgress<T>)、取消權杖 (CancellationToken)、非同步串流處理。

非同步 API 多語言支援示意