Share via


WhenAny: .NET Framework ve Windows Çalışma Zamanı (C# ve Visual Basic) arasında köprü oluşturma

Bu konudaki örnek, blog akışlarını, zaman uyumsuz görevleri tamamlanma sıralarına göre işleyen bir .NET Framework yöntemi ile zaman uyumsuz olarak indiren Windows Çalışma Zamanı türünü birleştirir.Tür hakkında daha fazla bilgi için bkz. SyndicationClient.Yöntem hakkında daha fazla bilgi için bkz. Task.WhenAny.

Bu özellikleri bir araya getirerek, birden fazla blog akışını eşzamanlı olarak karşıdan yüklemeye başlayabilir ve tamamlandığında sonuçları işleyebilirsiniz.Bir akış indirme işlemini diğerlerinden daha hızlı yapıyorsa önce bu akışın sonuçları görüntülenir.Bir SyndicationClient yöntemini kullanarak, özet akışlarını daha kolay karşıdan yükleyebilirsiniz; Task.WhenAny yöntemini kullanarak, karşıdan yüklemesi tamamlanan bir sonraki özet akışı kolaylıkla belirleyebilirsiniz.

[!NOT]

Örneği çalıştırmak için bilgisayarınızda Windows 8 yüklü olması gerekir.Buna ek olarak Visual Studio'daki örneği çalıştırmak istiyorsanız Visual Studio 2012, Visual Studio 2013, Windows 8 için Visual Studio Express 2012 veya Windows için Visual Studio Express 2013 programlarını yüklemeniz gerekir.

Aşağıdaki kod bu özellikleri Windows Çalışma Zamanı ve .NET Framework kaynaklarından bir araya getirir:

Try 
    Dim feedsQuery As IEnumerable(Of Task(Of SyndicationFeed)) =
        From uri In uriList
        Select client.RetrieveFeedAsync(uri).AsTask()
    ' AsTask changes the returns from RetrieveFeedAsync into tasks. 

    ' Run the query to start all the asynchronous processes. 
    Dim blogFeedTasksList As List(Of Task(Of SyndicationFeed)) = feedsQuery.ToList()

    Dim feed As SyndicationFeed

    ' Repeat the following until there are no tasks left: 
    '    - Grab the first one that finishes. 
    '    - Retrieve the results from the task (what the return statement  
    '      in RetrieveFeedAsync returns). 
    '    - Remove the task from the list. 
    '    - Display the results. 
    While blogFeedTasksList.Count > 0
        Dim nextTask As Task(Of SyndicationFeed) = Await Task.WhenAny(blogFeedTasksList)
        feed = Await nextTask
        blogFeedTasksList.Remove(nextTask)
        DisplayResults(feed)
    End While 

Catch ex As Exception
    ResultsTextBox.Text =
        "Page could not be loaded." & vbCrLf & "Exception: " & ex.ToString()
End Try
try
{
    IEnumerable<Task<SyndicationFeed>> feedsQuery =
            from uri in uriList
            // AsTask changes the returns from RetrieveFeedAsync into tasks. 
            select client.RetrieveFeedAsync(uri).AsTask();

    // Run the query to start all the asynchronous processes.
    List<Task<SyndicationFeed>> blogFeedTasksList = feedsQuery.ToList();

    SyndicationFeed feed;

    // Repeat the following until no tasks remain: 
    //    - Grab the first one that finishes. 
    //    - Retrieve the results from the task (what the return statement  
    //      in RetrieveFeedAsync returns). 
    //    - Remove the task from the list. 
    //    - Display the results. 
    while (blogFeedTasksList.Count > 0)
    {
        Task<SyndicationFeed> nextTask = await Task.WhenAny(blogFeedTasksList);
        feed = await nextTask;                    
        blogFeedTasksList.Remove(nextTask);
        DisplayResults(feed);
    }
}
catch (Exception ex)
{
    ResultsTextBox.Text =
        "Page could not be loaded.\n\r" + "Exception: " + ex.ToString();
}

Örnekte aşağıdaki satırlara benzer bir çıktı oluşturulur:Her blog için ekranda blogun başlığı ve sonrasında blog gönderilerinin başlıkları ve tarihleri gösterilir.

Developing for Windows
     New blog for Windows 8 app developers, 5/1/2012 2:33:02 PM -07:00
     Trigger-Start Services Recipe, 3/24/2011 2:23:01 PM -07:00
     . . .
     Countdown to PDC10, 10/26/2010 4:11:28 PM -07:00

Extreme Windows Blog
     PDXLAN 20: “Epidemic” Custom PC by Jon Hansz, 7/30/2012 2:31:35 PM -07:00
     Samsung Notebook Series 9: Taking Thin and Light to the Extreme, 7/23/2012 12:06:03 PM -07:00
     . . .
     AMD Unveils A-Series APUs, 6/13/2011 9:34:01 PM -07:00

Blogging Windows
     Windows 8 has reached the RTM milestone, 8/1/2012 9:00:00 AM -07:00
     Windows 8 will be available on…, 7/18/2012 1:09:00 PM -07:00
     . . .
     More buzz from BUILD – Developers get their devices!, 9/13/2011 7:47:57 PM -07:00

Springboard Series Blog
     What to Expect in User Experience Virtualization Beta 2, 6/25/2012 11:03:27 PM -07:00
     Introducing Microsoft BitLocker Administration 2.0 Beta, 6/12/2012 8:08:23 AM -07:00
     . . .
     The Springboard Series Visits Lima, Peru, 11/18/2011 5:27:37 AM -08:00

Bu konunun kalanında nasıl örnek oluşturulacağı ve bunun nasıl çalıştığı hakkında ayrıntılar sunulur.

Bu uygulamayı çalıştırmak için bilgisayarınızda Visual Studio 2012 ve Windows 8 yüklü olması gerekir.

Bu konu, aşağıdaki bölümleri içermektedir.

  • Örnek için Kurulum Seçenekleri
  • Başlatıcı Kodunu Kavrama
  • Başlatıcı Kodunu Genişletme
  • Başlatıcı Kodunu Karşıdan Yükleme
  • Tamamlanmış Uygulamayı Karşıdan Yükleme
  • Başlatıcı Kodunu Oluşturma
  • Tamamlanmış Uygulamayı Oluşturma
  • İlgili Konular

Örnek için Kurulum Seçenekleri

Örnek, Hızlı başlangıç: zaman uyumsuz programlama için await işlecini kullanma bölümünde açıklanan blog okuyucusunu temel alır.Ancak bu konunun başlatıcı kodu bir yerinde birden fazla blog akışı indirir.

Başlatıcı kodu blog akışlarını sıralı olarak indirmek için Windows Çalışma Zamanı işlevselliğini kullanır.Diğer bir deyişle, blog akışları URL'lerin koleksiyonunda listelendikleri sırada karşıdan yüklenir.Tamamlanmış uygulama, blog akışlarını tamamlandıkları sırayla indirmek için .NET Framework kaynağından işlevler ekler.

Örnek kodu aşağıdaki yöntemlerden biriyle oluşturabilirsiniz:

  • Başlatıcı kodu.

    • Başlangıç kodunu Başlangıç Kodunu İndirme sayfasındaki talimatları kullanarak indirebilirsiniz.

    • Başlatıcı kodunu Başlatıcı Kodunu Oluşturma sayfasındaki talimatları kullanarak oluşturabilirsiniz.

    • Başlatıcı kodunu Başlatıcı Kodunu Oluşturma bölümüne inerek uygulamadan inceleyebilirsiniz.

  • Uygulama tamamlandı.

    • Tamamlanmış uygulamayı Tamamlanmış Uygulamayı İndirme sayfasındaki talimatları kullanarak indirebilirsiniz.

    • Tamamlanmış uygulamayı Tamamlanmış Uygulamayı Oluşturma sayfasındaki talimatları kullanarak kendiniz oluşturabilirsiniz.

    • Tamamlanmış uygulamayı Tamamlanmış Uygulamayı Derleme bölümüne inerek uygulamadan inceleyebilirsiniz.

Başlatıcı Kodunu Anlama bölümü, temel çözümdeki önemli noktaları açıklar.

Başlatıcı Kodunu Genişletme bölümü, AsTask``2 ve Task.WhenAny ekleyerek kodu nasıl değiştireceğinizi gösterir.

Başlatıcı Kodunu Kavrama

Başlatıcı kodu bir URI listesinden blog akışı indirmek için bir SyndicationClient yöntemi, RetrieveFeedAsync kullanır.Yönteme yönelik her çağrı, devam eden zaman uyumsuz bir işlemi temsil eden bir IAsyncOperationWithProgress örneği döndürür.Bekletildiğinde zaman uyumsuz işlem, indirilen blog akışı hakkında bilgi içeren bir SyndicationFeed örneği üretir.

Kod, her URI listesindeki her bir girişe RetrieveFeedAsync uygulayan bir sorgu tanımlar.Sorgu çalıştırıldığında IAsyncOperationWithProgress örneği koleksiyonu döndürür.

Dim feedsQuery As IEnumerable(Of IAsyncOperationWithProgress(Of SyndicationFeed, 
                                                                RetrievalProgress)) =
                                                From uri In uriList
                                                Select client.RetrieveFeedAsync(uri)
IEnumerable<IAsyncOperationWithProgress<SyndicationFeed, 
    RetrievalProgress>> feedsQuery = from uri in uriList
                                     select client.RetrieveFeedAsync(uri);

ToList``1, sorguyu çalıştırır ve aşağıdaki kodun gösterdiği gibi zaman uyumsuz işlemleri başlatır.

Dim blogFeedOpsList As List(Of IAsyncOperationWithProgress(Of SyndicationFeed, 
                                                           RetrievalProgress)) =
                                               feedsQuery.ToList()
List<IAsyncOperationWithProgress<SyndicationFeed, 
    RetrievalProgress>> blogFeedOpsList = feedsQuery.ToList();

Bu noktada, bir etkin IAsyncOperationWithProgress örnekleri listesine sahip olursunuz.Sonuçları elde etmek için yine her bir örneği belirtmeniz gerekir.

Aşağıdaki döngü her IAsyncOperationWithProgress örneğinin SyndicationFeed sonuçlarını almasını bekler.

Dim feed As SyndicationFeed
For Each blogFeedOp In blogFeedOpsList
    ' The Await operator retrieves the final result (a SyndicationFeed instance) 
    ' from each IAsyncOperation instance.
    feed = Await blogFeedOp
    DisplayResults(feed)
Next
SyndicationFeed feed;
foreach (var blogFeedOp in blogFeedOpsList)
{
    // The await operator retrieves the final result (a SyndicationFeed instance) 
    // from each IAsyncOperation instance.
    feed = await blogFeedOp;
    DisplayResults(feed);
}

Programın bu sürümünü, konunun sonundaki Başlatıcı Kodunu Oluşturma bölümünden inceleyebilirsiniz.

Zaman uyumsuz Windows Çalışma Zamanı API'lar ile programlama hakkında daha fazla bilgiyi Hızlı başlangıç: Zaman uyumsuz programlama için await işlecini kullanma sayfasında bulabilirsiniz.

Başlatıcı Kodunu Genişletme

Başlatıcı kodu SyndicationClient sayesinde blog akışlarını indirmenin daha kolay olduğunu göstermiştir.Örneği tamamlamak için kalan adım, blog akışlarını URI listesinde göründükleri sıra yerine, yüklenmelerinin tamamlandığı sırada işlemek için uygulamayı etkinleştirmektir.

Geliştirmeyi tamamlamak için anahtar Task.WhenAny yöntemidir.Zaman uyumsuz işlem koleksiyonlarına WhenAny uyguladığınızda yöntem tamamlanan ilk işlemi döndürerek beklemeniz gereken zamanı en aza indirir.Bu örnekte, blog akışı bilgilerinin görüntülenme sırası önemli değildir.Bir indirme yavaş ise, önce başka bir bloga ait sonuçlar görüntülenebilir.Durum, WhenAny için tek istisnayla mükemmel gibi görünmektedir: WhenAny bir görev koleksiyonu gerektirir.

AsTask Başlatma

WhenAny, Task veya Task örneklerinin koleksiyonunu gerektirir ancak blok akışlarını indiren SyndicationClient yöntemi IAsyncOperationWithProgress örneği döndürür.Bu nedenle uygulamanın IAsyncOperationWithProgress nesneleri (Windows Çalışma Zamanı) ile Task nesneleri (.NET Framework) arasında köprü oluşturması gerekir.

.NET Framework geçiş yapmak için AsTask``2 genişletme yöntemleri sağlar.AsTask öğesini IAsyncOperationWithProgress örneğinde çağırdığınızda, AsTask, zaman uyumsuz işlemi temsil eden bir görev döndürür.Karşılık gelen IAsyncOperationWithProgress örneği tamamlandığında görev de tamamlanır ve görev örneğin sonucunu veya özel durumunu içerir.

Bu nedenle AsTask öğesini IAsyncOperationWithProgress örneklerinde RetrieveFeedAsync döndürdükçe çağırırsınız, aşağıdaki kod bunu gösterir.Kod değişkenleri görev değişikliğini yansıtacak biçimde yeniden adlandırır ve net olması için açık yazımı kullanır.

Dim feedsQuery As IEnumerable(Of Task(Of SyndicationFeed)) =
    From uri In uriList
    Select client.RetrieveFeedAsync(uri).AsTask()
' AsTask changes the returns from RetrieveFeedAsync into tasks. 

' Run the query to start all the asynchronous processes. 
Dim blogFeedTasksList As List(Of Task(Of SyndicationFeed)) = feedsQuery.ToList()
IEnumerable<Task<SyndicationFeed>> feedsQuery =
        from uri in uriList
        // AsTask changes the returns from RetrieveFeedAsync into tasks. 
        select client.RetrieveFeedAsync(uri).AsTask();

// Run the query to start all the asynchronous processes.
List<Task<SyndicationFeed>> blogFeedTasksList = feedsQuery.ToList();

[!NOT]

AsTask; zaman uyumsuz programlamada, büyük olasılıkla farkında olmadığınız önemli bir rol oynar.Bir IAsyncAction veya IAsyncOperation örneğine her "await" işleci uyguladığınızda, derleyici aşağıdaki kodun gösterdiği gibi AsTask kullanır.

WhenAny uygulama

Dönüştürmenin son adımı uygulamaya Task.WhenAny yöntemini eklemektir.WhenAny bir görev koleksiyonuna uygulanır (blogFeedTasksList) ve koleksiyonda tamamlanan ilk görevi döndürür.Özellikle, WhenAny, bekletildiğinde ilk önce tamamlanan görevi değerlendiren bir görev döndürür.

Aşağıdaki deyim WhenAny çağırır ve sonucunu bekler.Kod sonucu daha net göstermek için açık yazım kullanır.

Dim nextTask As Task(Of SyndicationFeed) = Await Task.WhenAny(blogFeedTasksList)
Task<SyndicationFeed> nextTask = await Task.WhenAny(blogFeedTasksList);

Aşağıdaki kod önceki ifade ile aynı şeyi yapar ancak ne olduğunu açıklamak için işlemi iki ifadeye ayırır.İlk ifade WhenAny çağırır ve ikinci ifade sonucu bekler.

' WhenAny returns a task that, when awaited, produces a task.
' Call:
Dim whenAnyTask As Task(Of Task(Of SyndicationFeed)) = Task.WhenAny(blogFeedTasksList)
' Await:
Dim nextTask As Task(Of SyndicationFeed) = Await whenAnyTask
// WhenAny returns a task that, when awaited, produces a task.
// Call:
Task<Task<SyndicationFeed>> whenAnyTask = Task.WhenAny(blogFeedTasksList);
// Await:
Task<SyndicationFeed> nextTask = await whenAnyTask;

Son olarak, sonuçları almak için ilk olarak tamamlanan görevde nextTask öğesini beklemeniz gerekir (SyndicationFeed örneği), ardından nextTask öğesini yeniden işlememek için listeden kaldırabilirsiniz.

feed = Await nextTask
blogFeedTasksList.Remove(nextTask)
feed = await nextTask;                    
blogFeedTasksList.Remove(nextTask);

Bu adımları blogFeedTasksList içindeki her görev için gerçekleştirmek üzere while döngüsü kullanın.

While blogFeedTasksList.Count > 0
    Dim nextTask As Task(Of SyndicationFeed) = Await Task.WhenAny(blogFeedTasksList)
    feed = Await nextTask
    blogFeedTasksList.Remove(nextTask)
    DisplayResults(feed)
End While
while (blogFeedTasksList.Count > 0)
{
    Task<SyndicationFeed> nextTask = await Task.WhenAny(blogFeedTasksList);
    feed = await nextTask;                    
    blogFeedTasksList.Remove(nextTask);
    DisplayResults(feed);
}

Programın bu sürümünü, konunun sonundaki Tamamlanmış Uygulamayı Derleme bölümünden inceleyebilirsiniz.Veya projeyi indirmek için Tamamlanmış Uygulamayı İndirme bölümündeki yönergeleri izleyebilirsiniz.

Uyarı notuUyarı

Örnekte açıklandığı üzere döngü içinde WhenAny kullanımı, az sayıda görev içeren sorunlar için iyidir.Ancak işlemeniz gereken çok sayıda görev varsa diğer yaklaşımlar daha etkilidir.Daha fazla bilgi ve örnek için bkz. Görevleri tamamlandı olarak işleme.

Başlatıcı Kodunu Karşıdan Yükleme

Örnek için başlangıç kodunu Async Sample: Bridging from .NET to Windows sayfasından indirebilirsiniz.Internet erişiminiz yoksa, bir başlatıcı kodu oluşturmak için bu konunun sonundaki Başlatıcı Kodunu Oluşturma bölümündeki yönergelere bakın.

Kodu indirdikten sonra aşağıdaki adımları uygulayarak açıp çalıştırın.

  1. Karşıdan yüklenen sıkıştırılmış dosyayı açın ve daha sonra Visual Studio 2012 öğesini başlatın.

  2. Menü çubuğunda, Dosya, , Proje/Çözüm seçeneklerini belirleyin.

  3. Sıkıştırması açılmış örnek kodun bulunduğu klasöre gidin ve AsTaskWhenAnyDemoVB veya AsTaskWhenAnyDemoCS için çözüm dosyasını (.sln) açın.

  4. Çözüm Gezgini içinde SequentialBlogReader projesinin kısayol menüsünü açın arından Başlangıç Projesi Olarak Ayarla öğesini seçin.

  5. Projeyi oluşturmak ve çalıştırmak için F5 tuşuna basın.

  6. Sonuçların her zaman aynı sırada görüntülendiğini doğrulamak için kodu birkaç kez çalıştırın.

MainPage.xaml.vb veya MainPage.xaml.cs dosyalarını konunun sonundaki Başlatıcı Kodunu Oluşturma bölümünden inceleyebilirsiniz.

Örnek, Hızlı başlangıç: zaman uyumsuz programlama için await işlecini kullanma bölümünde açıklanan blog okuyucusunu temel alır.Ancak bu konunun başlatıcı kodu bir yerinde birden fazla blog akışı indirir.

Uygulamada yapabileceğiniz çok çeşitli geliştirmeler ve uzantılar hakkında daha fazla bilgi için bkz. Bir blog okuyucusu oluşturma.

Tamamlanmış Uygulamayı Karşıdan Yükleme

Örneği kendiniz yapılandırmak istemiyorsanız örneğin tamamını indirebilirsiniz.Başlatıcı Kodunu İndirme bölümündeki yönergeleri izleyin ancak WhenAnyBlogReader öğesini Başlangıç Projesi olarak belirleyin.

Blog akışlarının farklı sırada görüntülendiğini doğrulamak için programı birkaç kez çalıştırın.

MainPage.xaml.vb veya MainPage.xaml.cs dosyalarını konunun sonundaki Tamamlanmış Uygulamayı Derleme bölümünden inceleyebilirsiniz.

Başlatıcı Kodunu Oluşturma

Bu konudaki örnekleri Async Sample: Bridging from .NET to Windows sayfasından indirebilirsiniz.Uygulamayı kendiniz ayarlamak isterseniz, aşağıdaki adımları izleyin.

  1. Visual Studio 2012 öğesini başlatın.

  2. Menü çubuğunda Dosya, Yeni, Proje seçeneğini belirleyin.

    Yeni Proje iletişim kutusu açılır.

  3. Yüklü, Şablonlar kategorisinde Visual Basic veya Visual C# seçin ve ardından proje türleri listesinden Windows Mağazası öğesini seçin.

  4. Proje türleri listesinde Boş Uygulama (XAML) öğesini seçin.

  5. Projeyi SequentialBlogReader olarak adlandırın ve ardından Tamam düğmesini seçin.

    Çözüm Gezgini içinde yeni proje görüntülenir.

  6. Çözüm Gezgini içinde MainPage.xaml için kısayol menüsünü açın ve ardından seçeneğini belirleyin.

  7. MainPage.xaml XAML penceresinde kodu, aşağıdaki kodla değiştirin.

    <Page
        x:Class="SequentialBlogReader.MainPage"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:AsTaskWhenAnyDemo"
        xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button x:Name="StartButton" Content="Start" HorizontalAlignment="Stretch" Margin="325,128,330,0" VerticalAlignment="Top" Click="StartButton_Click" Height="71" Background="#FFA89B9B" FontWeight="Bold" FontSize="36"/>
            <TextBox x:Name="ResultsTextBox" Margin="325,222,330,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="546" FontSize="10" ScrollViewer.VerticalScrollBarVisibility="Visible" />
        </Grid>
    </Page>
    

    Bir metin kutusu ve MainPage.xaml öğesinin Design penceresinde görünen bir düğme içeren basit bir pencere.

    Kullanıcı arayüzünde yapabileceğiniz çok çeşitli geliştirmeler ve uzantılar hakkında daha fazla bilgi için bkz. Bir blog okuyucusu oluşturma.

  8. Çözüm Gezgini içinde MainPage.xaml.vb veya MainPage.xaml.cs kısayol menüsünü açın ve Kodu Görüntüle öğesini seçin.

  9. MainPage.xaml.vb veya MainPage.xaml.cs dosyasındaki kodu aşağıdaki kodla değiştirin.

    ' Add an Imports statement for SyndicationClient. 
    Imports Windows.Web.Syndication
    
    
    ' The Blank Page item template is documented at http:'go.microsoft.com/fwlink/?LinkId=234238 
    
    Public NotInheritable Class MainPage
        Inherits Page
    
        Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    
        End Sub 
    
    
        ' The async modifier enables you to use await in the event handler. 
        Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
            ResultsTextBox.Text = "" 
    
            ' Disable the button until the operation is complete.
            StartButton.IsEnabled = False 
    
            Dim client As Windows.Web.Syndication.SyndicationClient = New SyndicationClient()
    
            ' Force the SyndicationClient to download the information.
            client.BypassCacheOnRetrieve = True 
    
            Dim uriList = CreateUriList()
    
            Try 
                Dim feedsQuery As IEnumerable(Of IAsyncOperationWithProgress(Of SyndicationFeed, 
                                                                                RetrievalProgress)) =
                                                                From uri In uriList
                                                                Select client.RetrieveFeedAsync(uri)
    
                ' Run the query to start all the asynchronous processes. 
                Dim blogFeedOpsList As List(Of IAsyncOperationWithProgress(Of SyndicationFeed, 
                                                                           RetrievalProgress)) =
                                                               feedsQuery.ToList()
    
                Dim feed As SyndicationFeed
                For Each blogFeedOp In blogFeedOpsList
                    ' The Await operator retrieves the final result (a SyndicationFeed instance) 
                    ' from each IAsyncOperation instance.
                    feed = Await blogFeedOp
                    DisplayResults(feed)
                Next 
    
            Catch ex As Exception
                ResultsTextBox.Text =
                    "Page could not be loaded." & vbCrLf & "Exception: " & ex.ToString()
            End Try 
    
            ' Reenable the button in case you want to run the operation again.
            StartButton.IsEnabled = True 
        End Sub 
    
    
        Function CreateUriList() As List(Of Uri)
    
            ' Create a list of URIs. 
            Dim uriList = New List(Of Uri) From
            {
                    New Uri("https://windowsteamblog.com/windows/b/developers/atom.aspx"),
                    New Uri("https://windowsteamblog.com/windows/b/extremewindows/atom.aspx"),
                    New Uri("https://windowsteamblog.com/windows/b/bloggingwindows/atom.aspx"),
                    New Uri("https://windowsteamblog.com/windows/b/springboard/atom.aspx")
            }
            Return uriList
        End Function 
    
    
        Sub DisplayResults(sf As SyndicationFeed)
    
            ' Title of the blog.
            ResultsTextBox.Text &= sf.Title.Text & vbCrLf
    
            ' Titles and dates for blog posts. 
            For Each item As SyndicationItem In sf.Items
    
                ResultsTextBox.Text &= vbTab & item.Title.Text & ", " &
                                    item.PublishedDate.ToString() & vbCrLf
            Next
    
            ResultsTextBox.Text &= vbCrLf
        End Sub 
    End Class
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;
    
    // Add a using directive for SyndicationClient. 
    using Windows.Web.Syndication;
    
    
    namespace SequentialBlogReader
    {
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
            }
    
    
            private async void StartButton_Click(object sender, RoutedEventArgs e)
            {
                ResultsTextBox.Text = "";
    
                // Disable the button until the operation is complete.
                StartButton.IsEnabled = false;
    
                Windows.Web.Syndication.SyndicationClient client = new SyndicationClient();
    
                // Force the SyndicationClient to download the information.
                client.BypassCacheOnRetrieve = true;
    
                var uriList = CreateUriList();
    
                try
                {
                    IEnumerable<IAsyncOperationWithProgress<SyndicationFeed, 
                        RetrievalProgress>> feedsQuery = from uri in uriList
                                                         select client.RetrieveFeedAsync(uri);
    
                    // Run the query to start all the asynchronous processes.
                    List<IAsyncOperationWithProgress<SyndicationFeed, 
                        RetrievalProgress>> blogFeedOpsList = feedsQuery.ToList();
    
                    SyndicationFeed feed;
                    foreach (var blogFeedOp in blogFeedOpsList)
                    {
                        // The await operator retrieves the final result (a SyndicationFeed instance) 
                        // from each IAsyncOperation instance.
                        feed = await blogFeedOp;
                        DisplayResults(feed);
                    }
                }
                catch (Exception ex)
                {
                    ResultsTextBox.Text =
                        "Page could not be loaded.\n\r" + "Exception: " + ex.ToString();
                }
    
                // Reenable the button in case you want to run the operation again.
                StartButton.IsEnabled = true;
            }
    
            List<Uri> CreateUriList()
            {
                // Create a list of URIs.
                List<Uri> uriList = new List<Uri> 
                { 
                    new Uri("https://windowsteamblog.com/windows/b/developers/atom.aspx"),
                    new Uri("https://windowsteamblog.com/windows/b/extremewindows/atom.aspx"),
                    new Uri("https://windowsteamblog.com/windows/b/bloggingwindows/atom.aspx"),
                    new Uri("https://windowsteamblog.com/windows/b/springboard/atom.aspx")
                };
                return uriList;
            }
    
    
            void DisplayResults(SyndicationFeed sf)
            {
                // Title of the blog.
                ResultsTextBox.Text += sf.Title.Text + "\r\n";
    
                // Titles and dates for blog posts. 
                foreach (SyndicationItem item in sf.Items)
                {
                    ResultsTextBox.Text += "\t" + item.Title.Text + ", " +
                                        item.PublishedDate.ToString() + "\r\n";
                }
                ResultsTextBox.Text += "\r\n";
            }
        }
    }
    
  10. Programı çalıştırmak için F5 tuşuna basın ve sonra Başlat düğmesine basın.

Tamamlanmış Uygulamayı Oluşturma

Bu konudaki örnekleri Async Sample: Bridging from .NET to Windows sayfasından indirebilirsiniz.Uygulamayı kendiniz ayarlamak isterseniz, aşağıdaki adımları izleyin.

  1. Visual Studio 2012 öğesini başlatın.

  2. Menü çubuğunda Dosya, Yeni, Proje seçeneğini belirleyin.

    Yeni Proje iletişim kutusu açılır.

  3. Yüklü, Şablonlar kategorisinde Visual Basic veya Visual C# seçin ve ardından Windows Mağazası öğesini seçin.

  4. Proje türleri listesinden Boş Uygulama (XAML) öğesini seçin.

  5. Projeyi WhenAnyBlogReader olarak adlandırın ve ardından Tamam düğmesini seçin.

    Çözüm Gezgini içinde yeni proje görüntülenir.

  6. Çözüm Gezgini içinde MainPage.xaml için kısayol menüsünü açın ve ardından seçeneğini belirleyin.

  7. MainPage.xaml XAML penceresinde kodu, aşağıdaki kodla değiştirin.

    <Page
        x:Class="WhenAnyBlogReader.MainPage"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:AsTaskWhenAnyDemo"
        xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button x:Name="StartButton" Content="Start" HorizontalAlignment="Stretch" Margin="325,128,330,0" VerticalAlignment="Top" Click="StartButton_Click" Height="71" Background="#FFA89B9B" FontWeight="Bold" FontSize="36"/>
            <TextBox x:Name="ResultsTextBox" Margin="325,222,330,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="546" FontSize="10" ScrollViewer.VerticalScrollBarVisibility="Visible" />
        </Grid>
    </Page>
    

    Bir metin kutusu ve MainPage.xaml öğesinin Design penceresinde görünen bir düğme içeren basit bir pencere.

    Uygulamada yapabileceğiniz çok çeşitli geliştirmeler ve uzantılar hakkında daha fazla bilgi için bkz. Bir blog okuyucusu oluşturma.

  8. Çözüm Gezgini içinde MainPage.xaml.vb veya MainPage.xaml.cs kısayol menüsünü açın ve Kodu Görüntüle öğesini seçin.

  9. MainPage.xaml.vb veya MainPage.xaml.cs dosyasındaki kodu aşağıdaki kodla değiştirin.

    ' Add an Imports statement for SyndicationClient. 
    Imports Windows.Web.Syndication
    
    ' Add an Imports statement for the Tasks. 
    Imports System.Threading.Tasks
    
    ' The Blank Page item template is documented at http:'go.microsoft.com/fwlink/?LinkId=234238 
    
    Public NotInheritable Class MainPage
        Inherits Page
    
        Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
        End Sub 
    
    
        Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
    
            ResultsTextBox.Text = "" 
    
            ' Disable the button until the operation is complete.
            StartButton.IsEnabled = False 
    
            Dim client As Windows.Web.Syndication.SyndicationClient = New SyndicationClient()
    
            ' Force the SyndicationClient to download the information.
            client.BypassCacheOnRetrieve = True 
    
            Dim uriList = CreateUriList()
    
            ' The following code avoids the use of implicit typing so that you  
            ' can see the types clearly. 
    
            Try 
                Dim feedsQuery As IEnumerable(Of Task(Of SyndicationFeed)) =
                    From uri In uriList
                    Select client.RetrieveFeedAsync(uri).AsTask()
                ' AsTask changes the returns from RetrieveFeedAsync into tasks. 
    
                ' Run the query to start all the asynchronous processes. 
                Dim blogFeedTasksList As List(Of Task(Of SyndicationFeed)) = feedsQuery.ToList()
    
                Dim feed As SyndicationFeed
    
                ' Repeat the following until there are no tasks left: 
                '    - Grab the first one that finishes. 
                '    - Retrieve the results from the task (what the return statement  
                '      in RetrieveFeedAsync returns). 
                '    - Remove the task from the list. 
                '    - Display the results. 
                While blogFeedTasksList.Count > 0
                    Dim nextTask As Task(Of SyndicationFeed) = Await Task.WhenAny(blogFeedTasksList)
                    feed = Await nextTask
                    blogFeedTasksList.Remove(nextTask)
                    DisplayResults(feed)
                End While 
    
            Catch ex As Exception
                ResultsTextBox.Text =
                    "Page could not be loaded." & vbCrLf & "Exception: " & ex.ToString()
            End Try 
    
            ' Reenable the button in case you want to run the operation again.
            StartButton.IsEnabled = True 
        End Sub 
    
    
        Function CreateUriList() As List(Of Uri)
    
            ' Create a list of URIs. 
            Dim uriList = New List(Of Uri) From
            {
                    New Uri("https://windowsteamblog.com/windows/b/developers/atom.aspx"),
                    New Uri("https://windowsteamblog.com/windows/b/extremewindows/atom.aspx"),
                    New Uri("https://windowsteamblog.com/windows/b/bloggingwindows/atom.aspx"),
                    New Uri("https://windowsteamblog.com/windows/b/springboard/atom.aspx")
            }
            Return uriList
        End Function 
    
    
        Sub DisplayResults(sf As SyndicationFeed)
    
            ' Title of the blog.
            ResultsTextBox.Text &= sf.Title.Text & vbCrLf
    
            ' Titles and dates for blog posts. 
            For Each item As SyndicationItem In sf.Items
    
                ResultsTextBox.Text &= vbTab & item.Title.Text & ", " &
                                    item.PublishedDate.ToString() & vbCrLf
            Next
    
            ResultsTextBox.Text &= vbCrLf
        End Sub 
    End Class
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;
    
    // Add a using directive for SyndicationClient. 
    using Windows.Web.Syndication;
    
    // Add a using directive for the Tasks. 
    using System.Threading.Tasks;
    
    
    namespace WhenAnyBlogReader
    {
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
            }
    
    
            private async void StartButton_Click(object sender, RoutedEventArgs e)
            {
                ResultsTextBox.Text = "";
    
                // Disable the button until the operation is complete.
                StartButton.IsEnabled = false;
    
                Windows.Web.Syndication.SyndicationClient client = new SyndicationClient();
    
                // Force the SyndicationClient to download the information.
                client.BypassCacheOnRetrieve = true;
    
                var uriList = CreateUriList();
    
                // The following code avoids the use of implicit typing (var) so that you  
                // can identify the types clearly. 
    
                try
                {
                    IEnumerable<Task<SyndicationFeed>> feedsQuery =
                            from uri in uriList
                            // AsTask changes the returns from RetrieveFeedAsync into tasks. 
                            select client.RetrieveFeedAsync(uri).AsTask();
    
                    // Run the query to start all the asynchronous processes.
                    List<Task<SyndicationFeed>> blogFeedTasksList = feedsQuery.ToList();
    
                    SyndicationFeed feed;
    
                    // Repeat the following until no tasks remain: 
                    //    - Grab the first one that finishes. 
                    //    - Retrieve the results from the task (what the return statement  
                    //      in RetrieveFeedAsync returns). 
                    //    - Remove the task from the list. 
                    //    - Display the results. 
                    while (blogFeedTasksList.Count > 0)
                    {
                        Task<SyndicationFeed> nextTask = await Task.WhenAny(blogFeedTasksList);
                        feed = await nextTask;                    
                        blogFeedTasksList.Remove(nextTask);
                        DisplayResults(feed);
                    }
                }
                catch (Exception ex)
                {
                    ResultsTextBox.Text =
                        "Page could not be loaded.\n\r" + "Exception: " + ex.ToString();
                }
    
                // Reenable the button in case you want to run the operation again.
                StartButton.IsEnabled = true;
            }
    
    
            List<Uri> CreateUriList()
            {
                // Create a list of URIs.
                List<Uri> uriList = new List<Uri> 
                { 
                    new Uri("https://windowsteamblog.com/windows/b/developers/atom.aspx"),
                    new Uri("https://windowsteamblog.com/windows/b/extremewindows/atom.aspx"),
                    new Uri("https://windowsteamblog.com/windows/b/bloggingwindows/atom.aspx"),
                    new Uri("https://windowsteamblog.com/windows/b/springboard/atom.aspx")
                };
                return uriList;
            }
    
    
            void DisplayResults(SyndicationFeed sf)
            {
                // Title of the blog.
                ResultsTextBox.Text += sf.Title.Text + "\r\n";
    
                // Titles and dates for blog posts. 
                foreach (SyndicationItem item in sf.Items)
                {
                    ResultsTextBox.Text += "\t" + item.Title.Text + ", " +
                                        item.PublishedDate.ToString() + "\r\n";
                }
                ResultsTextBox.Text += "\r\n";
            }
        }
    }
    
  10. Programı çalıştırmak için F5 tuşuna basın ve sonra Başlat düğmesine basın.

Ayrıca bkz.

Başvuru

WhenAny``1

AsTask``1

Kavramlar

Async ve Await ile Zaman Uyumsuz Programlama (C# ve Visual Basic)

Bir Görev Tamamlandıktan Sonra Geri Kalan Zaman Uyumsuz Görevleri İptal Etme (C# ve Visual Basic)

Zaman Uyumsuz Birden Çok Görevi Başlatma ve Görevleri Tamamlandıkça İşleme (C# ve Visual Basic)

Diğer Kaynaklar

Hızlı Başlangıç: zaman uyumsuz programlama için 'await' işlecini kullanma

Bir blog okuyucusu oluşturma

IAsyncOperationWithProgress