Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ha aszinkron kódot ad hozzá az alkalmazáshoz, érdemes megfontolni és esetleg megelőzni az újrabelépést, ami azt jelenti, hogy az aszinkron műveletbe újra beléphet, mielőtt az befejeződött volna. Ha nem azonosítja és kezeli az újbóli belépés lehetőségeit, az váratlan eredményeket okozhat.
Megjegyzé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.
Megjegyzé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 .NET-keretrendszer 4.7-esnél korábbi verzióját célozza meg, tekintse meg a Transport Layer Security (TLS) ajánlott eljárásait a .NET-keretrendszerrel kapcsolatban.
Újra belépé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 a végén jelenik meg.
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.
Újra belépés kezelése
Az újrahasználhatóság többféleképpen is kezelhető, attól függően, hogy mit szeretne, hogy az alkalmazás tegyen. 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 lévő gomb letiltásával letilthatja a StartButton_Click gombot egy művelet futtatása közben. Ezután, amikor a művelet befejeződik, a gombot újra engedélyezhetjük a Finally blokkon belül, hogy a felhasználók ismét 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ásdFine-Tuning Az Async-alkalmazás (Visual Basic) című témakört.
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 ,
ctsamely az összes metódus hatókörébe tartozik.Class MainWindow // Or Class MainPage ' *** Declare a System.Threading.CancellationTokenSource. Dim cts As CancellationTokenSourceItt
StartButton_Clickállapítsa meg, hogy egy művelet már folyamatban van-e. Ha actsértékeNothing, akkor nincs már 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
ctsegy 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 = newCTSA
StartButton_Clickvégén az aktuális folyamat befejeződik, ezért azctsértékét állítsa visszaNothing-re.' *** 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, amely elfogadja a törlési tokent
StartButton_Click.Használja a GetAsync módszert a webhelyek letöltésére, mert a
GetAsyncelfogad egy CancellationToken argumentumot.Mielőtt meghívja
DisplayResultsaz 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 jelenti, hogy a tényleges letöltési tevékenység összekeveredik, ahogy az Reentrancia felismerése kimenete is mutatja, de az egyes csoportok eredményeinek listája külön jelenik meg.
A műveletek osztoznak egy globális Task és pendingWork-en, 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ó groupkülönböző csoportok kimenetét címkézve ellenőrzi, hogy az eredmények a várt sorrendben jelennek-e meg.
Kattintási Eseménykezelő
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ő elindítja AccessTheWebAsync, hogy futtassa 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 AccessTheWebAsync két metódusra bontja. 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 egy pendingWork helyen AccessTheWebAsync részére 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 csoportosan végighalad a letöltési feladatokon, mindegyiket megvárva, megjeleníti a letöltött weboldal hosszát, és hozzáadja ezt a hosszt a teljes összeghez.
Az első utasítás FinishOneGroupAsync a pendingWork arra használja, hogy biztosítsa, hogy a metódushoz való belépés ne zavarjon olyan műveletet, ami már a megjelenítési folyamatban van, vagy ami már várakozik. Ha egy ilyen művelet folyamatban van, a belépő műveletnek meg kell várnia 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.
Érdekes pontok
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: 915908A
pendingWorkfeladat csak az A csoport elejénNothingvanFinishOneGroupAsync, 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 még nem tért vissza a(z)AccessTheWebAsync-hez, és az első hozzárendelés a(z)pendingWork-hez még 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_Clickindítása és a csoportpendingWorkfeladatá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 csak akkor fejez be egy várakozási kifejezést, amikor a művelet belépFinishOneGroupAsync. 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.
Megjegyzés:
A példa asztali Windows Presentation Foundation (WPF) alkalmazásként való 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.
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őben 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 a .NET-keretrendszer 4.6-os vagy újabb verzióját, majd kattintson az OK gombra.Az új projekt megjelenik a Megoldáskezelőben.
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őben, 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őben 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 a System.Net.Http elemhez, ha még nincs kijelölve.
A Megoldáskezelőben 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-ben 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 ClassA 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 kimenetet várólistára tenni az újrafutás kezeléséhez.