Megosztás a következőn keresztül:


Újraküldés kezelése az Async Appsben (Visual Basic)

Ha aszinkron kódot ad hozzá az alkalmazáshoz, érdemes megfontolni és esetleg megelőzni az újrabeírást, ami azt jelenti, hogy az aszinkron műveletet újra kell újraküldnie, mielőtt befejeződött volna. Ha nem azonosítja és kezeli az újrabecsülhető lehetőségeket, az váratlan eredményeket okozhat.

Feljegyzés

A példa futtatásához telepítve kell lennie a Visual Studio 2012-nek vagy újabbnak, valamint a .NET-keretrendszer 4.5-ös vagy újabb verziójának.

Feljegyzés

A Transport Layer Security (TLS) 1.2-es verziója mostantól az alkalmazásfejlesztéshez használandó minimális verzió. Ha az alkalmazás a 4.7-esnél korábbi .NET-keretrendszer verziót célozza meg, tekintse meg a Transport Layer Security (TLS) ajánlott eljárásait a .NET-keretrendszer.

Újraértelmezés felismerése

A jelen témakörben szereplő példában a felhasználók a Start gombot választva elindítanak egy aszinkron alkalmazást, amely letölt egy webhelysorozatot, és kiszámítja a letöltött bájtok teljes számát. A példa szinkron verziója ugyanúgy válaszol, függetlenül attól, hogy egy felhasználó hányszor választja ki a gombot, mert a felhasználói felületi szál az első alkalom után figyelmen kívül hagyja ezeket az eseményeket, amíg az alkalmazás nem fut. Az aszinkron alkalmazásokban azonban a felhasználói felületi szál továbbra is válaszol, és előfordulhat, hogy az aszinkron műveletet újból végrehajtja, mielőtt befejeződött volna.

Az alábbi példa a várt kimenetet mutatja, ha a felhasználó csak egyszer választja a Start gombot. Megjelenik a letöltött webhelyek listája az egyes webhelyek bájtban megadott méretével. A bájtok teljes száma megjelenik a végén.

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

Ha azonban a felhasználó többször választja ki a gombot, az eseménykezelőt többször is meghívja a rendszer, és a letöltési folyamat minden alkalommal újra megtörténik. Ennek eredményeképpen egyszerre több aszinkron művelet is fut, a kimenet összekapcsolja az eredményeket, és a bájtok teljes száma zavaró.

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

A kimenetet előállító kódot a témakör végére görgetve tekintheti át. Kísérletezhet a kóddal a megoldás helyi számítógépre való letöltésével, majd a WebsiteDownload projekt futtatásával, vagy a jelen témakör végén található kód használatával saját projekt létrehozásához. További információt és útmutatást a Példaalkalmazás áttekintése és futtatása című témakörben talál.

Újraküldés kezelése

Az újrarekedtség többféleképpen is kezelhető, attól függően, hogy mit szeretne tenni az alkalmazással. Ez a témakör a következő példákat mutatja be:

A Start gomb letiltása

Az eseménykezelő tetején StartButton_Click lévő gomb letiltásával letilthatja a Start gombot egy művelet futtatása közben. Ezután a művelet befejeződése után újra el lehet végezni a gombot egy Finally blokkból, hogy a felhasználók újra futtathassák az alkalmazást.

Az alábbi kód ezeket a változásokat jeleníti meg, amelyek csillagokkal vannak megjelölve. A módosításokat a témakör végén hozzáadhatja a kódhoz, vagy letöltheti a kész alkalmazást az Async Samples: Reentrancy in .NET Desktop Apps alkalmazásból. A projekt neve DisableStartButton.

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

A módosítások következtében a gomb nem válaszol a webhelyek letöltése közben AccessTheWebAsync , így a folyamat nem hajtható végre újra.

A művelet megszakítása és újraindítása

A Start gomb letiltása helyett a gombot aktív állapotban tarthatja, de ha a felhasználó ismét ezt a gombot választja, szakítsa meg a már futó műveletet, és hagyja, hogy a legutóbb elindított művelet folytatódjon.

A lemondással kapcsolatos további információkért lásd az Async-alkalmazás (Visual Basic) finomhangolását.

A forgatókönyv beállításához végezze el a következő módosításokat a példaalkalmazás áttekintésében és futtatásában megadott alapkódon. A kész alkalmazást az Async Samples: Reentrancy in .NET Desktop Apps alkalmazásból is letöltheti. A projekt neve CancelAndRestart.

  1. Deklaráljon egy változót CancellationTokenSource , ctsamely az összes metódus hatókörébe tartozik.

    Class MainWindow // Or Class MainPage
    
        ' *** Declare a System.Threading.CancellationTokenSource.
        Dim cts As CancellationTokenSource
    
  2. Itt StartButton_Clickállapítsa meg, hogy egy művelet már folyamatban van-e. Ha az érték cts értéke, Nothingakkor nincs még aktív művelet. Ha az érték nem Nothing, a már futó művelet megszakad.

    ' *** If a download process is already underway, cancel it.
    If cts IsNot Nothing Then
        cts.Cancel()
    End If
    
  3. Állítson be cts egy másik értéket, amely az aktuális folyamatot jelöli.

    ' *** Now set cts to cancel the current process if the button is chosen again.
    Dim newCTS As CancellationTokenSource = New CancellationTokenSource()
    cts = newCTS
    
  4. A folyamat végén StartButton_Clickaz aktuális folyamat befejeződött, ezért állítsa vissza az értéket cts a következőre Nothing: .

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

Az alábbi kód az összes módosítást megjeleníti a következőben StartButton_Click: . Az összeadások csillagokkal vannak megjelölve.

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

Ebben a fájlban AccessTheWebAsyncvégezze el a következő módosításokat.

  • Adjon hozzá egy paramétert, amelyből elfogadhatja a lemondási jogkivonatot StartButton_Click.

  • Használja a módszert a GetAsync webhelyek letöltésére, mert GetAsync elfogad egy argumentumot CancellationToken .

  • Mielőtt meghívja DisplayResults az egyes letöltött webhelyek eredményeit, ellenőrizze ct , hogy az aktuális művelet nem lett-e megszakítva.

Az alábbi kód ezeket a változásokat jeleníti meg, amelyek csillagokkal vannak megjelölve.

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

Ha az alkalmazás futtatása közben többször is a Start gombot választja, az alábbi kimenethez hasonló eredményt kell eredményeznie:

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

A részleges listák eltávolításához bontsa ki az első kódsort StartButton_Click , hogy törölje a szövegdobozt minden alkalommal, amikor a felhasználó újraindítja a műveletet.

Több művelet futtatása és a kimenet várólistára helyezése

Ez a harmadik példa a legbonyolultabb abban, hogy az alkalmazás minden alkalommal elindít egy aszinkron műveletet, amikor a felhasználó a Start gombot választja, és az összes művelet befejeződik. Az összes kért művelet aszinkron módon tölti le a webhelyeket a listáról, de a műveletek kimenete egymás után jelenik meg. Ez azt jelzi, hogy a tényleges letöltési tevékenység egymásba van osztva, ahogy az újraértelmezés kimenete is mutatja, de az egyes csoportok eredményeinek listája külön jelenik meg.

A műveletek egy globális Task, pendingWorkamely a megjelenítési folyamat kapuőreként szolgál.

Ezt a példát úgy futtathatja, hogy beilleszti a módosításokat az alkalmazás létrehozásakor a kódba, vagy az alkalmazás letöltésére vonatkozó utasításokat követve letölti a mintát, majd futtatja a QueueResults projektet.

Az alábbi kimenet akkor jeleníti meg az eredményt, ha a felhasználó csak egyszer választja a Start gombot. Az A betűcímke azt jelzi, hogy az eredmény a Start gomb első kiválasztásának időpontjából származik. A számok az URL-címek sorrendjét jelenítik meg a letöltési célok listájában.

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

Ha a felhasználó háromszor választja a Start gombot, az alkalmazás az alábbi sorokhoz hasonló kimenetet hoz létre. A fontjellel (#) kezdődő információs sorok az alkalmazás előrehaladását követik nyomon.

#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 B és C csoportok az A csoport befejeződése előtt kezdődnek, de az egyes csoportok kimenete külön jelenik meg. Először az A csoport összes kimenete jelenik meg, majd a B csoport összes kimenete, majd a C csoport összes kimenete. Az alkalmazás mindig sorrendben jeleníti meg a csoportokat, és minden csoport esetében mindig az egyes webhelyek adatait jeleníti meg abban a sorrendben, hogy az URL-címek megjelenjenek az URL-címek listájában.

A letöltések tényleges bekövetkeztének sorrendjét azonban nem tudja előrejelezni. Több csoport elindítása után az általuk létrehozott letöltési feladatok mind aktívak. Nem feltételezheti, hogy az A-1 a B-1 előtt lesz letöltve, és nem feltételezheti, hogy az A-1 az A-2 előtt lesz letöltve.

Globális definíciók

A mintakód az alábbi két globális deklarációt tartalmazza, amelyek minden metódusból láthatók.

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)

A Task változó felügyeli a megjelenítési folyamatot, pendingWorkés megakadályozza, hogy bármely csoport megszakítsa egy másik csoport megjelenítési műveletét. A karakterváltozó groupkülönböző csoportok kimenetét címkézve ellenőrzi, hogy az eredmények a várt sorrendben jelennek-e meg.

Az Eseménykezelő kattintása

Az eseménykezelő minden alkalommal növeli a csoport betűjelét, StartButton_Clickamikor a felhasználó a Start gombot választja. Ezután a kezelő meghívja AccessTheWebAsync a letöltési műveletet.

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

Az AccessTheWebAsync metódus

Ez a példa két metódusra oszlik AccessTheWebAsync . Az első metódus elindítja egy csoport összes letöltési feladatát, AccessTheWebAsyncés beállítja pendingWork a megjelenítési folyamat vezérlését. A metódus egy nyelvvel integrált lekérdezést (LINQ-lekérdezést) használ, és ToArray az összes letöltési feladatot egyszerre indítja el.

AccessTheWebAsync ezután meghívja FinishOneGroupAsync az egyes letöltések befejezését, és megjeleníti annak hosszát.

FinishOneGroupAsync A függvényben hozzárendelt pendingWorkAccessTheWebAsyncfeladatot ad vissza. Ez az érték megakadályozza egy másik művelet megszakítását a feladat befejezése előtt.

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

A FinishOneGroupAsync metódus

Ez a módszer végigjárja a letöltési feladatokat egy csoportban, mindegyikre várva, megjeleníti a letöltött webhely hosszát, és hozzáadja a hosszt az összeghez.

Az első utasítás FinishOneGroupAsync arra használja pendingWork , hogy győződjön meg arról, hogy a metódus beírása nem zavarja a már a megjelenítési folyamatban lévő vagy már várakozó műveletet. Ha egy ilyen művelet folyamatban van, a beírt műveletnek várnia kell a sorát.

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

Ezt a példát úgy futtathatja, hogy beilleszti a módosításokat az alkalmazás felépítésében lévő kódba, vagy az alkalmazás letöltésére vonatkozó utasításokat követve letölti a mintát, majd futtatja a QueueResults projektet.

Fontos helyek

A kimenetben a fontjellel (#) kezdődő információs vonalak egyértelművé írják a példa működését.

A kimenet a következő mintákat jeleníti meg.

  • Egy csoport elindítható, miközben egy előző csoport megjeleníti a kimenetét, de az előző csoport kimenetének megjelenítése nem szakad meg.

    #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
    
  • A pendingWork feladat csak az A csoport elején FinishOneGroupAsync vanNothing, amely először indult el. Az A csoport még nem fejezte be a várakozási kifejezést, amikor eléri FinishOneGroupAsync. Ezért a vezérlés nem tért vissza AccessTheWebAsync, és az első hozzárendelés pendingWork nem történt meg.

  • A következő két sor mindig együtt jelenik meg a kimenetben. A kód soha nem szakad meg a csoport műveletének StartButton_Click indítása és a csoport pendingWorkfeladatának hozzárendelése között.

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

    Miután egy csoport belépett StartButton_Click, a művelet nem fejez be várakozási kifejezést, amíg a művelet be nem fejeződik FinishOneGroupAsync. Ezért a kód ezen szegmense alatt egyetlen más művelet sem nyerheti el az irányítást.

A példaalkalmazás áttekintése és futtatása

A példaalkalmazás jobb megértéséhez letöltheti, létrehozhatja saját maga, vagy áttekintheti a jelen témakör végén található kódot az alkalmazás implementálása nélkül.

Feljegyzés

A példa asztali Windows megjelenítési alaprendszer (WPF) alkalmazásként való futtatásához a Visual Studio 2012-nek vagy újabbnak, a .NET-keretrendszer 4.5-ös vagy újabb verziójának pedig telepítve kell lennie a számítógépre.

Az alkalmazás letöltése

  1. Töltse le a tömörített fájlt az Async Samples: Reentrancy fájlból a .NET Desktop Appsben.

  2. Bontsa ki a letöltött fájlt, majd indítsa el a Visual Studiót.

  3. A menüsávon válassza a Fájl, Megnyitás, Projekt/Megoldás lehetőséget.

  4. Keresse meg a tömörített mintakódot tartalmazó mappát, majd nyissa meg a megoldásfájlt (.sln).

  5. A Megoldáskezelő nyissa meg a futtatni kívánt projekt helyi menüjét, majd válassza a Beállítás startUpProjectként lehetőséget.

  6. A projekt létrehozásához és futtatásához válassza a CTRL+F5 billentyűkombinációt.

Az alkalmazás létrehozása

Az alábbi szakasz a példa WPF-alkalmazásként való létrehozásához szolgáló kódot tartalmazza.

WPF-alkalmazás létrehozása
  1. Indítsa el a Visual Studiót.

  2. A menüsávon válassza a Fájl, Új, Projekt lehetőséget.

    Megnyílik az Új projekt párbeszédpanel.

  3. A Telepített sablonok panelen bontsa ki a Visual Basic, majd a Windows elemet.

  4. A projekttípusok listájában válassza a WPF-alkalmazás lehetőséget.

  5. Nevezze el a projektetWebsiteDownloadWPF, válassza .NET-keretrendszer 4.6-os vagy újabb verziót, majd kattintson az OK gombra.

    Az új projekt megjelenik Megoldáskezelő.

  6. A Visual Studio Code Editorban válassza a MainWindow.xaml lapot.

    Ha a lap nem látható, nyissa meg a MainWindow.xaml helyi menüjét a Megoldáskezelő, majd válassza a Kód megtekintése lehetőséget.

  7. A MainWindow.xaml XAML nézetében cserélje le a kódot a következő kódra.

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

    A MainWindow.xaml Tervező nézetében megjelenik egy egyszerű ablak, amely egy szövegdobozt és egy gombot tartalmaz.

  8. A Megoldáskezelő kattintson a jobb gombbal a Hivatkozások elemre, és válassza a Hivatkozás hozzáadása lehetőséget.

    Adjon hozzá egy hivatkozást, System.Net.Httpha még nincs kijelölve.

  9. A Megoldáskezelő nyissa meg a MainWindow.xaml.vb helyi menüjét, majd válassza a Kód megtekintése lehetőséget.

  10. A MainWindow.xaml.vb cserélje le a kódot a következő kódra.

    ' 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. A program futtatásához válassza a CTRL+F5 billentyűkombinációt, majd kattintson többször a Start gombra.

  12. Végezze el a módosításokat a Start gomb letiltása, a művelet megszakítása és újraindítása, vagy több művelet futtatása és a kimenet várólistára helyezése az újraküldés kezeléséhez.

Lásd még