Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Win8 應用開發實戰:非同步程式設計與 async/await 模式完整範例

編輯:Windows 8 系統介紹

為什麼需要非同步?

桌面或 Web 應用執行耗時操作(網路請求、檔案 I/O、複雜運算)時,若在 UI 執行緒同步阻塞,介面將凍結無回應。非同步模式讓耗時邏輯在背景執行,UI 執行緒保持響應,使用者可繼續操作其他功能。

範例場景:從 Windows Blog 非同步抓取部落格列表

介面包含:
• 「Get Blogs」按鈕:觸發非同步抓取
• 「Change Text」按鈕:驗證 UI 執行緒未阻塞
• waitingText:顯示狀態文字
• blogList:顯示抓取結果

XAML 版面配置

<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>

核心 C# 程式碼

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...";
}

執行流程驗證

  1. 點擊「Get Blogs」→ 狀態顯示「Loading Blogs...」,非同步作業啟動。
  2. 此時點擊「Change Text」→ 狀態立即變為「Please Waiting...」,證明 UI 執行緒未阻塞,使用者可繼續互動。
  3. 資料抓取完成後 → 列表填入資料,狀態更新為「Completed!」。

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

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

非同步完成,顯示 Completed! 並填入資料

關鍵概念總結

  • async 修飾詞:標記方法包含非同步操作,編譯器會生成狀態機。
  • await 運算子:暫停方法執行直到等待的 Task 完成,控制權歸還呼叫者(UI 執行緒)。
  • Task / IAsyncOperation:非同步作業的抽象表示,支援續體、取消、例外處理。
  • WinRT API 命名慣例:非同步方法以 Async 結尾(如 RetrieveFeedAsync)。

延伸閱讀

非同步模式同樣適用於 JavaScript (WinJS.Promise)、VB.NET。更多進階主題:平行非同步 (Task.WhenAll)、進度回報 (IProgress<T>)、取消權杖 (CancellationToken)、非同步串流處理。

非同步 API 多語言支援示意

Copyright © Windows教程網 All Rights Reserved