Zaman Uyumsuz Uygulamalarda Yeniden Giriş İşleme (Visual Basic)

Uygulamanıza zaman uyumsuz kod eklediğinizde, yeniden giriş yapmayı göz önünde bulundurmanız ve büyük olasılıkla engellemeniz gerekir. Bu, tamamlanmadan önce zaman uyumsuz bir işlemin yeniden eklenmesini ifade eder. Yeniden giriş olasılıklarını tanımlamaz ve işlemezseniz, bu beklenmeyen sonuçlara neden olabilir.

Not

Örneği çalıştırmak için bilgisayarınızda Visual Studio 2012 veya üzeri ve .NET Framework 4.5 veya daha yeni bir sürümü yüklü olmalıdır.

Not

Aktarım Katmanı Güvenliği (TLS) sürüm 1.2 artık uygulama geliştirmenizde kullanılacak en düşük sürümdür. Uygulamanız 4.7'den önceki bir .NET Framework sürümünü hedef alıyorsa, .NET Framework ile Aktarım Katmanı Güvenliği (TLS) en iyi yöntemleri için aşağıdaki makaleye bakın.

Yeniden Giriş Tanıma

Bu konudaki örnekte, kullanıcılar bir dizi web sitesini indiren ve indirilen toplam bayt sayısını hesaplayan zaman uyumsuz bir uygulama başlatmak için başlangıç düğmesini seçer. Örneğin zaman uyumlu bir sürümü, kullanıcının düğmeyi kaç kez seçtiğinden bağımsız olarak aynı şekilde yanıt verir çünkü kullanıcı arabirimi iş parçacığı ilk kez çalıştırılana kadar bu olayları yoksayar. Ancak zaman uyumsuz bir uygulamada ui iş parçacığı yanıt vermeye devam eder ve tamamlanmadan önce zaman uyumsuz işlemi yeniden başlatabilirsiniz.

Aşağıdaki örnekte, kullanıcı Başlangıç düğmesini yalnızca bir kez seçerse beklenen çıkış gösterilir. İndirilen web sitelerinin listesi, her sitenin bayt cinsinden boyutuyla görüntülenir. Sonunda toplam bayt sayısı görüntülenir.

1. msdn.microsoft.com/library/hh191443.aspx                83732
2. msdn.microsoft.com/library/aa578028.aspx               205273
3. msdn.microsoft.com/library/jj155761.aspx                29019
4. msdn.microsoft.com/library/hh290140.aspx               117152
5. msdn.microsoft.com/library/hh524395.aspx                68959
6. msdn.microsoft.com/library/ms404677.aspx               197325
7. msdn.microsoft.com                                            42972
8. msdn.microsoft.com/library/ff730837.aspx               146159

TOTAL bytes returned:  890591

Ancak, kullanıcı düğmeyi birden çok kez seçerse, olay işleyicisi tekrar tekrar çağrılır ve indirme işlemi her seferinde yeniden başlatılır. Sonuç olarak, aynı anda birkaç zaman uyumsuz işlem çalıştırılır, çıkış sonuçları birbirine ekler ve toplam bayt sayısı kafa karıştırıcı olur.

1. msdn.microsoft.com/library/hh191443.aspx                83732
2. msdn.microsoft.com/library/aa578028.aspx               205273
3. msdn.microsoft.com/library/jj155761.aspx                29019
4. msdn.microsoft.com/library/hh290140.aspx               117152
5. msdn.microsoft.com/library/hh524395.aspx                68959
1. msdn.microsoft.com/library/hh191443.aspx                83732
2. msdn.microsoft.com/library/aa578028.aspx               205273
6. msdn.microsoft.com/library/ms404677.aspx               197325
3. msdn.microsoft.com/library/jj155761.aspx                29019
7. msdn.microsoft.com                                            42972
4. msdn.microsoft.com/library/hh290140.aspx               117152
8. msdn.microsoft.com/library/ff730837.aspx               146159

TOTAL bytes returned:  890591

5. msdn.microsoft.com/library/hh524395.aspx                68959
1. msdn.microsoft.com/library/hh191443.aspx                83732
2. msdn.microsoft.com/library/aa578028.aspx               205273
6. msdn.microsoft.com/library/ms404677.aspx               197325
3. msdn.microsoft.com/library/jj155761.aspx                29019
4. msdn.microsoft.com/library/hh290140.aspx               117152
7. msdn.microsoft.com                                            42972
5. msdn.microsoft.com/library/hh524395.aspx                68959
8. msdn.microsoft.com/library/ff730837.aspx               146159

TOTAL bytes returned:  890591

6. msdn.microsoft.com/library/ms404677.aspx               197325
7. msdn.microsoft.com                                            42972
8. msdn.microsoft.com/library/ff730837.aspx               146159

TOTAL bytes returned:  890591

Bu konunun sonuna kaydırarak bu çıkışı üreten kodu gözden geçirebilirsiniz. Çözümü yerel bilgisayarınıza indirip Web Sitesini İndir projesini çalıştırarak veya kendi projenizi oluşturmak için bu konunun sonundaki kodu kullanarak kodla denemeler yapabilirsiniz. Daha fazla bilgi ve yönergeler için bkz . Örnek Uygulamayı Gözden Geçirme ve Çalıştırma.

Yeniden Giriş İşleme

Yeniden girişle, uygulamanızın ne yapmak istediğinize bağlı olarak çeşitli yollarla işleyebilirsiniz. Bu konu aşağıdaki örnekleri sunar:

Başlat Düğmesini Devre Dışı Bırakma

Olay işleyicisinin üst StartButton_Click kısmındaki düğmeyi devre dışı bırakarak bir işlem çalışırken Başlat düğmesini engelleyebilirsiniz. Ardından, kullanıcıların uygulamayı yeniden çalıştırabilmesi için işlem tamamlandığında düğmeyi bir Finally bloğun içinden yeniden ayarlayabilirsiniz.

Aşağıdaki kod, yıldız işaretiyle işaretlenmiş bu değişiklikleri gösterir. Bu konunun sonunda koda değişiklikleri ekleyebilir veya .NET Desktop Apps'te Zaman Uyumsuz Örnekler: Yeniden Giriş bölümünden tamamlanmış uygulamayı indirebilirsiniz. Proje adı DisableStartButton'tır.

Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
    ' This line is commented out to make the results clearer in the output.
    'ResultsTextBox.Text = ""

    ' ***Disable the Start button until the downloads are complete.
    StartButton.IsEnabled = False

    Try
        Await AccessTheWebAsync()

    Catch ex As Exception
        ResultsTextBox.Text &= vbCrLf & "Downloads failed."
    ' ***Enable the Start button in case you want to run the program again.
    Finally
        StartButton.IsEnabled = True

    End Try
End Sub

Değişiklikler sonucunda, web siteleri indirilirken AccessTheWebAsync düğme yanıt vermez, bu nedenle işlem yeniden giriş yapamaz.

İşlemi İptal Etme ve Yeniden Başlatma

Başlangıç düğmesini devre dışı bırakmak yerine düğmeyi etkin tutabilirsiniz, ancak kullanıcı bu düğmeyi yeniden seçerse zaten çalışmakta olan işlemi iptal eder ve en son başlatılan işlemin devam etmesine izin verir.

İptal hakkında daha fazla bilgi için bkz . Zaman Uyumsuz Uygulamanızda İnce Ayarlama (Visual Basic).

Bu senaryoyu ayarlamak için Örnek Uygulamayı Gözden Geçirme ve Çalıştırma bölümünde sağlanan temel kodda aşağıdaki değişiklikleri yapın. Tamamlanmış uygulamayı .NET Desktop Apps'te Zaman Uyumsuz Örnekler: Yeniden Giriş sayfasından da indirebilirsiniz. Bu projenin adı CancelAndRestart'tır.

  1. Tüm yöntemlerin kapsamında olan bir CancellationTokenSource değişken ctsbildirin.

    Class MainWindow // Or Class MainPage
    
        ' *** Declare a System.Threading.CancellationTokenSource.
        Dim cts As CancellationTokenSource
    
  2. içinde StartButton_Click, bir işlemin zaten devam edip etmediğini belirleyin. değeri cts ise Nothing, hiçbir işlem zaten etkin değildir. değer değilse Nothing, zaten çalışmakta olan işlem iptal edilir.

    ' *** If a download process is already underway, cancel it.
    If cts IsNot Nothing Then
        cts.Cancel()
    End If
    
  3. Geçerli işlemi temsil eden farklı bir değere ayarlayın cts .

    ' *** Now set cts to cancel the current process if the button is chosen again.
    Dim newCTS As CancellationTokenSource = New CancellationTokenSource()
    cts = newCTS
    
  4. öğesinin StartButton_Clicksonunda geçerli işlem tamamlanır, bu nedenle değerini geri olarak ctsNothingayarlayın.

    ' *** When the process completes, signal that another process can proceed.
    If cts Is newCTS Then
        cts = Nothing
    End If
    

Aşağıdaki kod içindeki StartButton_Clicktüm değişiklikleri gösterir. Eklemeler yıldız işaretiyle işaretlenir.

Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

    ' This line is commented out to make the results clearer.
    'ResultsTextBox.Text = ""

    ' *** If a download process is underway, cancel it.
    If cts IsNot Nothing Then
        cts.Cancel()
    End If

    ' *** Now set cts to cancel the current process if the button is chosen again.
    Dim newCTS As CancellationTokenSource = New CancellationTokenSource()
    cts = newCTS

    Try
        ' *** Send a token to carry the message if the operation is canceled.
        Await AccessTheWebAsync(cts.Token)

    Catch ex As OperationCanceledException
        ResultsTextBox.Text &= vbCrLf & "Download canceled." & vbCrLf

    Catch ex As Exception
        ResultsTextBox.Text &= vbCrLf & "Downloads failed."
    End Try

    ' *** When the process is complete, signal that another process can proceed.
    If cts Is newCTS Then
        cts = Nothing
    End If
End Sub

içinde AccessTheWebAsyncaşağıdaki değişiklikleri yapın.

  • 'den StartButton_Clickiptal belirtecini kabul etmek için bir parametre ekleyin.

  • GetAsync Bir CancellationToken bağımsız değişken kabul ettiğinden GetAsync web sitelerini indirmek için yöntemini kullanın.

  • İndirilen her web sitesinin sonuçlarını görüntülemek için aramadan DisplayResults önce geçerli ct işlemin iptal edilmediğini denetleyin.

Aşağıdaki kod, yıldız işaretiyle işaretlenmiş bu değişiklikleri gösterir.

' *** Provide a parameter for the CancellationToken from StartButton_Click.
Private Async Function AccessTheWebAsync(ct As CancellationToken) As Task

    ' Declare an HttpClient object.
    Dim client = New HttpClient()

    ' Make a list of web addresses.
    Dim urlList As List(Of String) = SetUpURLList()

    Dim total = 0
    Dim position = 0

    For Each url In urlList
        ' *** Use the HttpClient.GetAsync method because it accepts a
        ' cancellation token.
        Dim response As HttpResponseMessage = Await client.GetAsync(url, ct)

        ' *** Retrieve the website contents from the HttpResponseMessage.
        Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()

        ' *** Check for cancellations before displaying information about the
        ' latest site.
        ct.ThrowIfCancellationRequested()

        position += 1
        DisplayResults(url, urlContents, position)

        ' Update the total.
        total += urlContents.Length
    Next

    ' Display the total count for all of the websites.
    ResultsTextBox.Text &=
        String.Format(vbCrLf & vbCrLf & "TOTAL bytes returned:  " & total & vbCrLf)
End Function

Bu uygulama çalışırken Başlangıç düğmesini birkaç kez seçerseniz, aşağıdaki çıkışa benzer sonuçlar üretmesi gerekir:

1. msdn.microsoft.com/library/hh191443.aspx                83732
2. msdn.microsoft.com/library/aa578028.aspx               205273
3. msdn.microsoft.com/library/jj155761.aspx                29019
4. msdn.microsoft.com/library/hh290140.aspx               122505
5. msdn.microsoft.com/library/hh524395.aspx                68959
6. msdn.microsoft.com/library/ms404677.aspx               197325
Download canceled.

1. msdn.microsoft.com/library/hh191443.aspx                83732
2. msdn.microsoft.com/library/aa578028.aspx               205273
3. msdn.microsoft.com/library/jj155761.aspx                29019
Download canceled.

1. msdn.microsoft.com/library/hh191443.aspx                83732
2. msdn.microsoft.com/library/aa578028.aspx               205273
3. msdn.microsoft.com/library/jj155761.aspx                29019
4. msdn.microsoft.com/library/hh290140.aspx               117152
5. msdn.microsoft.com/library/hh524395.aspx                68959
6. msdn.microsoft.com/library/ms404677.aspx               197325
7. msdn.microsoft.com                                            42972
8. msdn.microsoft.com/library/ff730837.aspx               146159

TOTAL bytes returned:  890591

Kısmi listeleri ortadan kaldırmak için, kullanıcı işlemi her yeniden başlatışında StartButton_Click metin kutusunu temizlemek için içindeki ilk kod satırının açıklamasını kaldırın.

Birden Çok İşlem Çalıştırma ve Çıkışı Kuyruğa Ekleme

Bu üçüncü örnek, kullanıcının Başlangıç düğmesini her seçtiğinde ve tüm işlemler tamamlanmak üzere çalıştığında uygulamanın başka bir zaman uyumsuz işlem başlatması en karmaşık örneğidir. İstenen tüm işlemler web sitelerini listeden zaman uyumsuz olarak indirir, ancak işlemlerden elde edilen çıkış sırayla sunulur. Diğer bir ifadeyle, Yeniden Giriş Tanıma'daki çıktı gösterildiği gibi gerçek indirme etkinliği birbirine eklenir, ancak her grubun sonuç listesi ayrı olarak sunulur.

İşlemler, görüntüleme işlemi için ağ geçidi denetleyicisi olarak hizmet veren genel Taskbir , pendingWorköğesini paylaşır.

Bu örneği, değişiklikleri Uygulama Oluşturma'daki koda yapıştırarak çalıştırabilirsiniz veya örneği indirmek ve ardından QueueResults projesini çalıştırmak için Uygulamayı İndirme başlığındaki yönergeleri izleyebilirsiniz.

Aşağıdaki çıkışta, kullanıcı Başlangıç düğmesini yalnızca bir kez seçerse sonuç gösterilir. A harfi etiketi, sonucun Başlangıç düğmesinin ilk seçildiğinden kaynaklandığını gösterir. Sayılar, indirme hedefleri listesindeki URL'lerin sırasını gösterir.

#Starting group A.
#Task assigned for group A.

A-1. msdn.microsoft.com/library/hh191443.aspx                87389
A-2. msdn.microsoft.com/library/aa578028.aspx               209858
A-3. msdn.microsoft.com/library/jj155761.aspx                30870
A-4. msdn.microsoft.com/library/hh290140.aspx               119027
A-5. msdn.microsoft.com/library/hh524395.aspx                71260
A-6. msdn.microsoft.com/library/ms404677.aspx               199186
A-7. msdn.microsoft.com                                            53266
A-8. msdn.microsoft.com/library/ff730837.aspx               148020

TOTAL bytes returned:  918876

#Group A is complete.

Kullanıcı Başlangıç düğmesini üç kez seçerse, uygulama aşağıdaki satırlara benzer bir çıkış üretir. Pound işareti (#) ile başlayan bilgi satırları uygulamanın ilerleme durumunu izler.

#Starting group A.
#Task assigned for group A.

A-1. msdn.microsoft.com/library/hh191443.aspx                87389
A-2. msdn.microsoft.com/library/aa578028.aspx               207089
A-3. msdn.microsoft.com/library/jj155761.aspx                30870
A-4. msdn.microsoft.com/library/hh290140.aspx               119027
A-5. msdn.microsoft.com/library/hh524395.aspx                71259
A-6. msdn.microsoft.com/library/ms404677.aspx               199185

#Starting group B.
#Task assigned for group B.

A-7. msdn.microsoft.com                                            53266

#Starting group C.
#Task assigned for group C.

A-8. msdn.microsoft.com/library/ff730837.aspx               148010

TOTAL bytes returned:  916095

B-1. msdn.microsoft.com/library/hh191443.aspx                87389
B-2. msdn.microsoft.com/library/aa578028.aspx               207089
B-3. msdn.microsoft.com/library/jj155761.aspx                30870
B-4. msdn.microsoft.com/library/hh290140.aspx               119027
B-5. msdn.microsoft.com/library/hh524395.aspx                71260
B-6. msdn.microsoft.com/library/ms404677.aspx               199186

#Group A is complete.

B-7. msdn.microsoft.com                                            53266
B-8. msdn.microsoft.com/library/ff730837.aspx               148010

TOTAL bytes returned:  916097

C-1. msdn.microsoft.com/library/hh191443.aspx                87389
C-2. msdn.microsoft.com/library/aa578028.aspx               207089

#Group B is complete.

C-3. msdn.microsoft.com/library/jj155761.aspx                30870
C-4. msdn.microsoft.com/library/hh290140.aspx               119027
C-5. msdn.microsoft.com/library/hh524395.aspx                72765
C-6. msdn.microsoft.com/library/ms404677.aspx               199186
C-7. msdn.microsoft.com                                            56190
C-8. msdn.microsoft.com/library/ff730837.aspx               148010

TOTAL bytes returned:  920526

#Group C is complete.

A grubu tamamlanmadan önce B ve C grupları başlatılır, ancak her grubun çıkışı ayrı olarak görüntülenir. Önce A grubu için tüm çıkış, ardından B grubu için tüm çıkış ve ardından C grubu için tüm çıkış görüntülenir. Uygulama her zaman grupları sırayla görüntüler ve her grup için her zaman tek tek web siteleri hakkındaki bilgileri URL'ler listesinde görünen sırayla görüntüler.

Ancak indirmelerin gerçek sırasına ilişkin tahminde bulunan bir durum yoktur. Birden çok grup başlatıldıktan sonra, oluşturdukları indirme görevlerinin tümü etkin olur. A-1'in B-1'dan önce indirileceğini ve A-1'in A-2'dan önce indirileceğini varsayamazsınız.

Genel Tanımlar

Örnek kod, tüm yöntemlerden görülebilen aşağıdaki iki genel bildirimi içerir.

Class MainWindow    ' Class MainPage in Windows Store app.

    ' ***Declare the following variables where all methods can access them.
    Private pendingWork As Task = Nothing
    Private group As Char = ChrW(AscW("A") - 1)

Task değişkeni, pendingWorkgörüntüleme işlemini denetler ve herhangi bir grubun başka bir grubun görüntüleme işlemini kesintiye uğratmasını önler. karakter değişkeni, groupsonuçların beklenen sırada göründüğünü doğrulamak için farklı gruplardan gelen çıkışı etiketler.

Click Olay İşleyicisi

Olay işleyicisi, StartButton_Clickkullanıcı Başlangıç düğmesini her seçtiğinde grup harfini artırır. Ardından işleyici indirme işlemini çalıştırmak için çağrısında AccessTheWebAsync bulunur.

Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
    ' ***Verify that each group's results are displayed together, and that
    ' the groups display in order, by marking each group with a letter.
    group = ChrW(AscW(group) + 1)
    ResultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "#Starting group {0}.", group)

    Try
        ' *** Pass the group value to AccessTheWebAsync.
        Dim finishedGroup As Char = Await AccessTheWebAsync(group)

        ' The following line verifies a successful return from the download and
        ' display procedures.
        ResultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "#Group {0} is complete." & vbCrLf, finishedGroup)

    Catch ex As Exception
        ResultsTextBox.Text &= vbCrLf & "Downloads failed."

    End Try
End Sub

AccessTheWebAsync Yöntemi

Bu örnek iki yönteme ayrılır AccessTheWebAsync . İlk yöntem olan , AccessTheWebAsyncbir grubun tüm indirme görevlerini başlatır ve görüntüleme işlemini denetlemek için ayarlar pendingWork . yöntemi bir Dil Tümleşik Sorgusu (LINQ sorgusu) kullanır ve ToArray tüm indirme görevlerini aynı anda başlatır.

AccessTheWebAsync ardından her indirme işleminin tamamlanmasını beklemeye ve uzunluğunu görüntülemeye yönelik çağrılar FinishOneGroupAsync yapın.

FinishOneGroupAsynciçinde AccessTheWebAsyncatanmış pendingWork bir görev döndürür. Bu değer, görev tamamlanmadan önce başka bir işlemin kesintiye uğramasını önler.

Private Async Function AccessTheWebAsync(grp As Char) As Task(Of Char)

    Dim client = New HttpClient()

    ' Make a list of the web addresses to download.
    Dim urlList As List(Of String) = SetUpURLList()

    ' ***Kick off the downloads. The application of ToArray activates all the download tasks.
    Dim getContentTasks As Task(Of Byte())() =
        urlList.Select(Function(addr) client.GetByteArrayAsync(addr)).ToArray()

    ' ***Call the method that awaits the downloads and displays the results.
    ' Assign the Task that FinishOneGroupAsync returns to the gatekeeper task, pendingWork.
    pendingWork = FinishOneGroupAsync(urlList, getContentTasks, grp)

    ResultsTextBox.Text &=
        String.Format(vbCrLf & "#Task assigned for group {0}. Download tasks are active." & vbCrLf, grp)

    ' ***This task is complete when a group has finished downloading and displaying.
    Await pendingWork

    ' You can do other work here or just return.
    Return grp
End Function

FinishOneGroupAsync Yöntemi

Bu yöntem bir gruptaki indirme görevleri arasında geçiş yaparak her birini bekler, indirilen web sitesinin uzunluğunu görüntüler ve toplamın uzunluğunu ekler.

içindeki FinishOneGroupAsync ilk deyimi, yöntemi girildiğinde zaten görüntüleme işleminde olan veya zaten bekleyen bir işlemi engellemediğinden emin olmak için kullanılır pendingWork . Böyle bir işlem devam ederse, giren işlemin sırayı beklemesi gerekir.

Private Async Function FinishOneGroupAsync(urls As List(Of String), contentTasks As Task(Of Byte())(), grp As Char) As Task

    ' Wait for the previous group to finish displaying results.
    If pendingWork IsNot Nothing Then
        Await pendingWork
    End If

    Dim total = 0

    ' contentTasks is the array of Tasks that was created in AccessTheWebAsync.
    For i As Integer = 0 To contentTasks.Length - 1
        ' Await the download of a particular URL, and then display the URL and
        ' its length.
        Dim content As Byte() = Await contentTasks(i)
        DisplayResults(urls(i), content, i, grp)
        total += content.Length
    Next

    ' Display the total count for all of the websites.
    ResultsTextBox.Text &=
        String.Format(vbCrLf & vbCrLf & "TOTAL bytes returned:  " & total & vbCrLf)
End Function

Bu örneği, değişiklikleri Uygulama Oluşturma'daki koda yapıştırarak çalıştırabilir veya örneği indirmek için Uygulamayı İndirme başlığındaki yönergeleri izleyebilir ve ardından QueueResults projesini çalıştırabilirsiniz.

İlgi Çekici Noktalar

Çıktıdaki bir pound işareti (#) ile başlayan bilgi satırları bu örneğin nasıl çalıştığını netleştirin.

Çıktı aşağıdaki desenleri gösterir.

  • Bir grup, önceki bir grup çıktısını görüntülerken başlatılabilir, ancak önceki grubun çıktısının görüntülenmesi kesintiye uğramaz.

    #Starting group A.
    #Task assigned for group A. Download tasks are active.
    
    A-1. msdn.microsoft.com/library/hh191443.aspx                87389
    A-2. msdn.microsoft.com/library/aa578028.aspx               207089
    A-3. msdn.microsoft.com/library/jj155761.aspx                30870
    A-4. msdn.microsoft.com/library/hh290140.aspx               119037
    A-5. msdn.microsoft.com/library/hh524395.aspx                71260
    
    #Starting group B.
    #Task assigned for group B. Download tasks are active.
    
    A-6. msdn.microsoft.com/library/ms404677.aspx               199186
    A-7. msdn.microsoft.com                                            53078
    A-8. msdn.microsoft.com/library/ff730837.aspx               148010
    
    TOTAL bytes returned:  915919
    
    B-1. msdn.microsoft.com/library/hh191443.aspx                87388
    B-2. msdn.microsoft.com/library/aa578028.aspx               207089
    B-3. msdn.microsoft.com/library/jj155761.aspx                30870
    
    #Group A is complete.
    
    B-4. msdn.microsoft.com/library/hh290140.aspx               119027
    B-5. msdn.microsoft.com/library/hh524395.aspx                71260
    B-6. msdn.microsoft.com/library/ms404677.aspx               199186
    B-7. msdn.microsoft.com                                            53078
    B-8. msdn.microsoft.com/library/ff730837.aspx               148010
    
    TOTAL bytes returned:  915908
    
  • Görev pendingWorkNothingFinishOneGroupAsync yalnızca ilk olarak başlatılan A grubu için başlangıcıdır. A Grubu, öğesine ulaştığında FinishOneGroupAsyncbir await ifadesini henüz tamamlamadı. Bu nedenle, denetim öğesine AccessTheWebAsyncgeri dönmemiştir ve ilk atama pendingWork gerçekleşmemiştir.

  • Aşağıdaki iki satır her zaman çıktıda birlikte görünür. Kodun, içinde bir grubun işlemini StartButton_Click başlatma ve gruba bir görev atama arasında hiçbir zaman kesintiye uğramaz pendingWork.

    #Starting group B.
    #Task assigned for group B. Download tasks are active.
    

    Bir grup girdikten StartButton_Clicksonra, işlem içine girene FinishOneGroupAsynckadar bir await ifadesini tamamlamaz. Bu nedenle, başka hiçbir işlem bu kod kesimi sırasında denetim elde edebilir.

Örnek Uygulamayı Gözden Geçirme ve Çalıştırma

Örnek uygulamayı daha iyi anlamak için uygulamayı indirebilir, kendiniz derleyebilir veya uygulamayı uygulamadan bu konunun sonundaki kodu gözden geçirebilirsiniz.

Not

Örneği bir Windows Presentation Foundation (WPF) masaüstü uygulaması olarak çalıştırmak için, bilgisayarınızda Visual Studio 2012 veya üzeri ve .NET Framework 4.5 veya daha yeni bir sürümü yüklü olmalıdır.

Uygulamayı İndirme

  1. .NET Desktop Apps'te Zaman Uyumsuz Örnekler: Yeniden Giriş sayfasından sıkıştırılmış dosyayı indirin.

  2. İndirdiğiniz dosyanın sıkıştırmasını açın ve Visual Studio'yu başlatın.

  3. Menü çubuğunda Dosya, Aç, Proje/Çözüm'e tıklayın.

  4. Açılmış örnek kodun bulunduğu klasöre gidin ve çözüm (.sln) dosyasını açın.

  5. Çözüm Gezgini'da, çalıştırmak istediğiniz projenin kısayol menüsünü açın ve ardından StartUpProject olarak ayarla'yı seçin.

  6. Projeyi derlemek ve çalıştırmak için CTRL+F5 tuşlarını seçin.

Uygulamayı Oluşturma

Aşağıdaki bölümde, örneği WPF uygulaması olarak derlemeye yönelik kod sağlanır.

WPF uygulaması oluşturmak için
  1. Visual Studio’yu çalıştırın.

  2. Menü çubuğunda Dosya, Yeni, Proje'yi seçin.

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

  3. Yüklü Şablonlar bölmesinde Visual Basic'i ve ardından Windows'u genişletin.

  4. Proje türleri listesinde WPF Uygulaması'nı seçin.

  5. Projeyi WebsiteDownloadWPFadlandırın, 4.6 veya üzeri .NET Framework sürümünü seçin ve tamam düğmesine tıklayın.

    Yeni proje Çözüm Gezgini görüntülenir.

  6. Visual Studio Code Düzenleyicisi'nde MainWindow.xaml sekmesini seçin.

    Sekme görünmüyorsa, Çözüm Gezgini'de MainWindow.xaml kısayol menüsünü açın ve kodu görüntüle'yi seçin.

  7. MainWindow.xaml dosyasının XAML görünümünde kodu aşağıdaki kodla değiştirin.

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:WebsiteDownloadWPF"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Width="517" Height="360">
            <Button x:Name="StartButton" Content="Start" HorizontalAlignment="Left" Margin="-1,0,0,0" VerticalAlignment="Top" Click="StartButton_Click" Height="53" Background="#FFA89B9B" FontSize="36" Width="518"  />
            <TextBox x:Name="ResultsTextBox" HorizontalAlignment="Left" Margin="-1,53,0,-36" TextWrapping="Wrap" VerticalAlignment="Top" Height="343" FontSize="10" ScrollViewer.VerticalScrollBarVisibility="Visible" Width="518" FontFamily="Lucida Console" />
        </Grid>
    </Window>
    

    MainWindow.xaml dosyasının Tasarım görünümünde metin kutusu ve düğme içeren basit bir pencere görüntülenir.

  8. Çözüm Gezgini'da Başvurular'a sağ tıklayın ve Başvuru Ekle'yi seçin.

    Henüz seçili değilse için System.Net.Httpbir başvuru ekleyin.

  9. Çözüm Gezgini'da, MainWindow.xaml.vb kısayol menüsünü açın ve kodu görüntüle'yi seçin.

  10. MainWindow.xaml.vb içinde kodu aşağıdaki kodla değiştirin.

    ' Add the following Imports statements, and add a reference for System.Net.Http.
    Imports System.Net.Http
    Imports System.Threading
    
    Class MainWindow
    
        Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
            System.Net.ServicePointManager.SecurityProtocol = System.Net.ServicePointManager.SecurityProtocol Or System.Net.SecurityProtocolType.Tls12
    
            ' This line is commented out to make the results clearer in the output.
            'ResultsTextBox.Text = ""
    
            Try
                Await AccessTheWebAsync()
    
            Catch ex As Exception
                ResultsTextBox.Text &= vbCrLf & "Downloads failed."
    
            End Try
        End Sub
    
        Private Async Function AccessTheWebAsync() As Task
    
            ' Declare an HttpClient object.
            Dim client = New HttpClient()
    
            ' Make a list of web addresses.
            Dim urlList As List(Of String) = SetUpURLList()
    
            Dim total = 0
            Dim position = 0
    
            For Each url In urlList
                ' GetByteArrayAsync returns a task. At completion, the task
                ' produces a byte array.
                Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    
                position += 1
                DisplayResults(url, urlContents, position)
    
                ' Update the total.
                total += urlContents.Length
            Next
    
            ' Display the total count for all of the websites.
            ResultsTextBox.Text &=
                String.Format(vbCrLf & vbCrLf & "TOTAL bytes returned:  " & total & vbCrLf)
        End Function
    
        Private Function SetUpURLList() As List(Of String)
            Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com/library/hh191443.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/jj155761.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/hh524395.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
            Return urls
        End Function
    
        Private Sub DisplayResults(url As String, content As Byte(), pos As Integer)
            ' Display the length of each website. The string format is designed
            ' to be used with a monospaced font, such as Lucida Console or
            ' Global Monospace.
    
            ' Strip off the "http:'".
            Dim displayURL = url.Replace("https://", "")
            ' Display position in the URL list, the URL, and the number of bytes.
            ResultsTextBox.Text &= String.Format(vbCrLf & "{0}. {1,-58} {2,8}", pos, displayURL, content.Length)
        End Sub
    End Class
    
  11. Programı çalıştırmak için CTRL+F5 tuşlarını seçin ve ardından Başlat düğmesini birkaç kez seçin.

  12. Başlangıç Düğmesini Devre Dışı Bırak, İşlemi İptal Et ve Yeniden Başlat'tan değişiklikleri yapın veya Yeniden giriş işlemini işlemek için Birden Çok İşlem Çalıştır ve Çıkışı Kuyruğa Alın.

Ayrıca bkz.