Windows 8 應用開發 - 異步調用

    不管是桌面客戶端仍是Web應用一般會出現處理時間較長的操做,爲了在這段時間內不影響用戶與應用之間的交互體驗,開發人員一般會使用異步調用技術,使得比較複雜的邏輯操做由異步進行,用戶仍然能夠繼續使用應用,不會有無響應的等待狀況出現。web

     本篇將經過一個簡單的實例演示如何在Windows 8 應用中使用異步編程。首先咱們來編寫一個「Get Blogs」按鈕,點擊它能夠從Windows Blog中獲取博客列表。固然獲取博客信息的過程是由異步進行的,這個過程當中爲了測試用戶仍然能夠與應用交互,咱們再設計一個「Change Text」用來修改waitingText的內容。編程

代碼

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

     接下來爲「Get Blogs」按鈕添加Click事件,getBlogs_Click與以往Click事件不一樣之處就在於多了一個async關鍵字,看到Async就說明下面的內容要經過異步方法來實現。方法中經過SyndicationClient.RetrieveFeedAsync獲取博客內容,並經過await操做符告知應用要調用異步操做,且不影響用戶正常交互。若是不使用的異步調用的話,用戶只能等待全部博客內容加載完成後,才能繼續使用該應用。windows

private async void getBlogs_Click(object sender, RoutedEventArgs e)  {      waitingText.Text = "Loading Blogs...";        SyndicationClient client = new SyndicationClient();        client.BypassCacheOnRetrieve = true;        Uri feedUri = new Uri("http://blogs.windows.com/windows/b/bloggingwindows/atom.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.ToString() + "/" +                            item.PublishedDate.Month.ToString() + "/" +                            item.PublishedDate.Day.ToString(),                  Title = item.Title.Text              });          }          blogList.ItemsSource = blogData;                    waitingText.Text = "Completed!";      }      catch (Exception ex)      {          waitingText.Text = "Can't load the page:" + ex.ToString();      }  }

演示

     運行程序點擊「Get Blogs」按鈕,如今應用已經經過異步方式獲取Blog內容,這是咱們能夠點擊「Change Text」來驗證一下用戶是否能夠繼續使用應該的其餘功能。app

點擊「Get Blogs」後會出現「Loading Blogs…」的字樣,說明此事異步調用已經啓動。異步

image

在獲取到博客內容前點擊「Change Text」,剛纔的文字會變爲「Please Waiting…」,說明當異步調用時用戶仍然能夠與應用進行交互。async

image

異步調用完成後,文字部分又被更新爲「Completed!」。ide

image

     至此,關於異步調用的開發就完成了。本篇內容只是異步調用的一種類型,固然還有許多其餘類型的API能夠供你們使用,並且包含C#、VB、JS多種語言開發。異步編程

image

源碼

http://sdrv.ms/XCAv6K測試

相關文章
相關標籤/搜索