Ú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:
-
Tiltsa le a Start gombot a művelet futtatása közben, hogy a felhasználó ne tudja megszakítani.
A művelet megszakítása és újraindítása
Szakítsa meg a még futó műveletet, amikor a felhasználó ismét a Start gombot választja, majd hagyja, hogy a legutóbb kért művelet folytatódjon.
Több művelet futtatása és a kimenet várólistára helyezése
Engedélyezze az összes kért művelet aszinkron futtatását, de koordinálja a kimenet megjelenítését, hogy az egyes műveletek eredményei együtt és sorrendben jelenjenek meg.
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.
Deklaráljon egy változót CancellationTokenSource ,
cts
amely az összes metódus hatókörébe tartozik.Class MainWindow // Or Class MainPage ' *** Declare a System.Threading.CancellationTokenSource. Dim cts As CancellationTokenSource
Itt
StartButton_Click
állapítsa meg, hogy egy művelet már folyamatban van-e. Ha az értékcts
értéke,Nothing
akkor nincs még aktív művelet. Ha az érték nemNothing
, 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
Á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
A folyamat végén
StartButton_Click
az aktuális folyamat befejeződött, ezért állítsa vissza az értéketcts
a következőreNothing
: .' *** 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 AccessTheWebAsync
vé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őrizzect
, 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, pendingWork
amely 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ó group
kü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_Click
amikor 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 pendingWork
AccessTheWebAsync
feladatot 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énFinishOneGroupAsync
vanNothing
, amely először indult el. Az A csoport még nem fejezte be a várakozási kifejezést, amikor elériFinishOneGroupAsync
. Ezért a vezérlés nem tért visszaAccessTheWebAsync
, és az első hozzárendeléspendingWork
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 csoportpendingWork
feladatá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ődikFinishOneGroupAsync
. 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
Töltse le a tömörített fájlt az Async Samples: Reentrancy fájlból a .NET Desktop Appsben.
Bontsa ki a letöltött fájlt, majd indítsa el a Visual Studiót.
A menüsávon válassza a Fájl, Megnyitás, Projekt/Megoldás lehetőséget.
Keresse meg a tömörített mintakódot tartalmazó mappát, majd nyissa meg a megoldásfájlt (.sln).
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.
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
Indítsa el a Visual Studiót.
A menüsávon válassza a Fájl, Új, Projekt lehetőséget.
Megnyílik az Új projekt párbeszédpanel.
A Telepített sablonok panelen bontsa ki a Visual Basic, majd a Windows elemet.
A projekttípusok listájában válassza a WPF-alkalmazás lehetőséget.
Nevezze el a projektet
WebsiteDownloadWPF
, válassza .NET-keretrendszer 4.6-os vagy újabb verziót, majd kattintson az OK gombra.Az új projekt megjelenik Megoldáskezelő.
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.
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.
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.
A Megoldáskezelő nyissa meg a MainWindow.xaml.vb helyi menüjét, majd válassza a Kód megtekintése lehetőséget.
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
A program futtatásához válassza a CTRL+F5 billentyűkombinációt, majd kattintson többször a Start gombra.
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: