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

Windows 8 應用程式開發:非同步呼叫 async/await 實作範例

編輯:Win8 系統應用技巧

為避免長時間運作凍結 UI 執行緒,Windows 8 應用程式開發必須善用非同步程式設計。本文以 C#/XAML 範例示範如何使用 async / await 關鍵字,在點擊「Get Blogs」按鈕時非同步取得 Windows Blog RSS 饋送,期間 UI 保持回應,可同時點擊「Change Text」按鈕修改文字內容。

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

執行流程驗證

  1. 點擊「Get Blogs」→ 顯示「Loading Blogs...」,非同步作業啟動。
  2. 此時點擊「Change Text」→ 文字立即變為「Please Waiting...」,證明 UI 執行緒未被阻塞。
  3. 資料取得完成後 → 文字更新為「Completed!」,列表顯示部落格項目。

點擊 Get Blobs 後載入中

非同步期間點擊 Change Text

非同步完成顯示 Completed

程式碼結構圖

關鍵概念

  • async 修飾方法,表示方法包含非同步作業。
  • await 運算子暫停方法執行直到等待的 Task 完成,**不阻塞呼叫執行緒**。
  • SyndicationClient.RetrieveFeedAsync 回傳 Task<SyndicationFeed>,適用 await。
  • 例外處理需包裹在 try/catch 中,避免未觀察到的例外導致應用程式終止。

延伸應用

同樣模式適用於檔案 I/O、網路請求、資料庫存取、感測器資料讀取等長時間作業。Windows Runtime 提供大量 *Async 方法,配合 async/await 撰寫流暢非同步程式碼。

Copyright © Windows教程網 All Rights Reserved