Aszinkron tevékenység vagy tevékenységek listájának lemondása (Visual Basic)
Beállíthat egy gombot, amellyel megszakíthatja az aszinkron alkalmazásokat, ha nem szeretné megvárni, amíg befejeződik. A jelen témakör példáit követve hozzáadhat egy lemondási gombot egy alkalmazáshoz, amely letölti egy webhely tartalmát vagy egy webhelylistát.
A példák az Async-alkalmazás (Visual Basic) finomhangolását ismertető felhasználói felületet használják.
Feljegyzés
A példák 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.
Tevékenység megszakítása
Az első példa egyetlen letöltési feladattal társítja a Mégse gombot. Ha a gombot választja, miközben az alkalmazás tartalmat tölt le, a letöltés megszakad.
A példa letöltése
Töltse le a teljes Windows megjelenítési alaprendszer (WPF) projektet az Async-mintából: Az alkalmazás finomhangolása, majd kövesse az alábbi lépéseket.
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.
A Projekt megnyitása párbeszédpanelen nyissa meg a kibontott mintakódot tartalmazó mappát, majd nyissa meg az AsyncFineTuningVB megoldásfájlját (.sln).
A Megoldáskezelő nyissa meg a CancelATask projekt helyi menüjét, majd válassza a Beállítás kezdőprojektként lehetőséget.
A projekt futtatásához válassza az F5 billentyűt.
A Ctrl+F5 billentyűkombinációval hibakeresés nélkül futtathatja a projektet.
Ha nem szeretné letölteni a projektet, a témakör végén áttekintheti a MainWindow.xaml.vb fájlokat.
A példa létrehozása
Az alábbi módosítások hozzáadnak egy Mégse gombot egy webhelyet letöltő alkalmazáshoz. Ha nem szeretné letölteni vagy felépíteni a példát, a témakör végén található "Példák kitöltése" szakaszban áttekintheti a végterméket. Csillag jelöli a kód módosításait.
A példa elkészítéséhez lépésről lépésre kövesse a "Példa letöltése" szakaszban található utasításokat, de a CancelATask helyett válassza a StarterCode-ot startUp projektként.
Ezután adja hozzá a következő módosításokat a projekt MainWindow.xaml.vb fájljába.
Deklaráljon egy változót
CancellationTokenSource
,cts
amely a hozzá hozzáférő összes metódus hatókörébe tartozik.Class MainWindow ' ***Declare a System.Threading.CancellationTokenSource. Dim cts As CancellationTokenSource
Adja hozzá az alábbi eseménykezelőt a Mégse gombra. Az eseménykezelő a CancellationTokenSource.Cancel metódus használatával értesíti
cts
, ha a felhasználó lemondást kér.' ***Add an event handler for the Cancel button. Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs) If cts IsNot Nothing Then cts.Cancel() End If End Sub
Végezze el az alábbi módosításokat a Start gomb eseménykezelőjében.
startButton_Click
A ,
cts
példányosításaCancellationTokenSource
.' ***Instantiate the CancellationTokenSource. cts = New CancellationTokenSource()
A hívásban
AccessTheWebAsync
, amely letölti egy adott webhely tartalmát, küldje el argumentumként a CancellationTokenSource.Token tulajdonságotcts
. AToken
tulajdonság a lemondás kérése esetén propagálja az üzenetet. Adjon hozzá egy fogási blokkot, amely üzenetet jelenít meg, ha a felhasználó úgy dönt, hogy megszakítja a letöltési műveletet. Az alábbi kód a módosításokat mutatja.Try ' ***Send a token to carry the message if cancellation is requested. Dim contentLength As Integer = Await AccessTheWebAsync(cts.Token) resultsTextBox.Text &= vbCrLf & $"Length of the downloaded string: {contentLength}." & vbCrLf ' *** If cancellation is requested, an OperationCanceledException results. Catch ex As OperationCanceledException resultsTextBox.Text &= vbCrLf & "Download canceled." & vbCrLf Catch ex As Exception resultsTextBox.Text &= vbCrLf & "Download failed." & vbCrLf End Try
Ebben
AccessTheWebAsync
az esetben használja a HttpClient.GetAsync(String, CancellationToken) metódus túlterhelésétGetAsync
a HttpClient webhely tartalmának letöltéséhez. Adja megct
a CancellationToken paramétertAccessTheWebAsync
a második argumentumként. A jogkivonat akkor hordozza az üzenetet, ha a felhasználó a Mégse gombot választja.Az alábbi kód a módosításokat mutatja be a következőben
AccessTheWebAsync
: .' ***Provide a parameter for the CancellationToken. Async Function AccessTheWebAsync(ct As CancellationToken) As Task(Of Integer) Dim client As HttpClient = New HttpClient() resultsTextBox.Text &= vbCrLf & "Ready to download." & vbCrLf ' You might need to slow things down to have a chance to cancel. Await Task.Delay(250) ' GetAsync returns a Task(Of HttpResponseMessage). ' ***The ct argument carries the message if the Cancel button is chosen. Dim response As HttpResponseMessage = Await client.GetAsync("https://msdn.microsoft.com/library/dd470362.aspx", ct) ' Retrieve the website contents from the HttpResponseMessage. Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync() ' The result of the method is the length of the downloaded website. Return urlContents.Length End Function
Ha nem mondja le a programot, a következő kimenetet hozza létre:
Ready to download. Length of the downloaded string: 158125.
Ha a Mégse gombot választja, mielőtt a program befejezi a tartalom letöltését, a program a következő kimenetet hozza létre:
Ready to download. Download canceled.
Tevékenységek listájának visszavonása
Az előző példát kiterjesztheti több tevékenység megszakítására is, ha ugyanazt CancellationTokenSource
a példányt társítja az egyes tevékenységekhez. Ha a Mégse gombot választja, megszakítja az összes még nem befejezett feladatot.
A példa letöltése
Töltse le a teljes Windows megjelenítési alaprendszer (WPF) projektet az Async-mintából: Az alkalmazás finomhangolása, majd kövesse az alábbi lépéseket.
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.
A Projekt megnyitása párbeszédpanelen nyissa meg a kibontott mintakódot tartalmazó mappát, majd nyissa meg az AsyncFineTuningVB megoldásfájlját (.sln).
A Megoldáskezelő nyissa meg a CancelAListOfTasks projekt helyi menüjét, majd válassza a Beállítás kezdőprojektként lehetőséget.
A projekt futtatásához válassza az F5 billentyűt.
A Ctrl+F5 billentyűkombinációval hibakeresés nélkül futtathatja a projektet.
Ha nem szeretné letölteni a projektet, a témakör végén áttekintheti a MainWindow.xaml.vb fájlokat.
A példa létrehozása
A példa kibővítéséhez lépésről lépésre kövesse a "Példa letöltése" szakasz utasításait, de startUp projektként válassza a CancelATask lehetőséget. Adja hozzá a következő módosításokat a projekthez. Csillag jelöli a program változásait.
Adjon hozzá egy metódust a webcímek listájának létrehozásához.
' ***Add a method that creates a list of web addresses. Private Function SetUpURLList() As List(Of String) Dim urls = New List(Of String) From { "https://msdn.microsoft.com", "https://msdn.microsoft.com/library/hh290138.aspx", "https://msdn.microsoft.com/library/hh290140.aspx", "https://msdn.microsoft.com/library/dd470362.aspx", "https://msdn.microsoft.com/library/aa578028.aspx", "https://msdn.microsoft.com/library/ms404677.aspx", "https://msdn.microsoft.com/library/ff730837.aspx" } Return urls End Function
Hívja meg a metódust a következőben
AccessTheWebAsync
: .' ***Call SetUpURLList to make a list of web addresses. Dim urlList As List(Of String) = SetUpURLList()
Adja hozzá a következő ciklust
AccessTheWebAsync
a lista egyes webcímeinek feldolgozásához.' ***Add a loop to process the list of web addresses. For Each url In urlList ' GetAsync returns a Task(Of HttpResponseMessage). ' Argument ct carries the message if the Cancel button is chosen. ' ***Note that the Cancel button can cancel all remaining downloads. Dim response As HttpResponseMessage = Await client.GetAsync(url, ct) ' Retrieve the website contents from the HttpResponseMessage. Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync() resultsTextBox.Text &= vbCrLf & $"Length of the downloaded string: {urlContents.Length}." & vbCrLf Next
Mivel
AccessTheWebAsync
megjeleníti a hosszokat, a metódusnak nem kell semmit visszaadnia. Távolítsa el a visszatérési utasítást, és módosítsa a metódus visszatérési típusát ahelyettTask<TResult>, hogy Task az .Async Function AccessTheWebAsync(ct As CancellationToken) As Task
A metódus
startButton_Click
meghívása kifejezés helyett utasítással.Await AccessTheWebAsync(cts.Token)
Ha nem mondja le a programot, a következő kimenetet hozza létre:
Length of the downloaded string: 35939. Length of the downloaded string: 237682. Length of the downloaded string: 128607. Length of the downloaded string: 158124. Length of the downloaded string: 204890. Length of the downloaded string: 175488. Length of the downloaded string: 145790. Downloads complete.
Ha a Letöltések befejezése előtt a Mégse gombot választja, a kimenet a lemondás előtt befejezett letöltések hosszát tartalmazza.
Length of the downloaded string: 35939. Length of the downloaded string: 237682. Length of the downloaded string: 128607. Downloads canceled.
Példák kitöltése
A következő szakaszok az előző példák kódját tartalmazzák. Figyelje meg, hogy hozzá kell adnia egy hivatkozást a következőhöz System.Net.Http: .
A projektek az Async-mintából tölthetők le: Az alkalmazás finomhangolása.
Példa tevékenység megszakítása
Az alábbi kód az egyetlen feladatot megszakító példa teljes MainWindow.xaml.vb fájlja.
' Add an Imports directive and a reference for System.Net.Http.
Imports System.Net.Http
' Add the following Imports directive for System.Threading.
Imports System.Threading
Class MainWindow
' ***Declare a System.Threading.CancellationTokenSource.
Dim cts As CancellationTokenSource
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)
' ***Instantiate the CancellationTokenSource.
cts = New CancellationTokenSource()
resultsTextBox.Clear()
Try
' ***Send a token to carry the message if cancellation is requested.
Dim contentLength As Integer = Await AccessTheWebAsync(cts.Token)
resultsTextBox.Text &=
vbCrLf & $"Length of the downloaded string: {contentLength}." & vbCrLf
' *** If cancellation is requested, an OperationCanceledException results.
Catch ex As OperationCanceledException
resultsTextBox.Text &= vbCrLf & "Download canceled." & vbCrLf
Catch ex As Exception
resultsTextBox.Text &= vbCrLf & "Download failed." & vbCrLf
End Try
' ***Set the CancellationTokenSource to Nothing when the download is complete.
cts = Nothing
End Sub
' ***Add an event handler for the Cancel button.
Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
If cts IsNot Nothing Then
cts.Cancel()
End If
End Sub
' ***Provide a parameter for the CancellationToken.
Async Function AccessTheWebAsync(ct As CancellationToken) As Task(Of Integer)
Dim client As HttpClient = New HttpClient()
resultsTextBox.Text &=
vbCrLf & "Ready to download." & vbCrLf
' You might need to slow things down to have a chance to cancel.
Await Task.Delay(250)
' GetAsync returns a Task(Of HttpResponseMessage).
' ***The ct argument carries the message if the Cancel button is chosen.
Dim response As HttpResponseMessage = Await client.GetAsync("https://msdn.microsoft.com/library/dd470362.aspx", ct)
' Retrieve the website contents from the HttpResponseMessage.
Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()
' The result of the method is the length of the downloaded website.
Return urlContents.Length
End Function
End Class
' Output for a successful download:
' Ready to download.
' Length of the downloaded string: 158125.
' Or, if you cancel:
' Ready to download.
' Download canceled.
Példa tevékenységek listájának megszakítása
A következő kód a feladatlistát megszakító példa teljes MainWindow.xaml.vb fájlja.
' Add an Imports directive and a reference for System.Net.Http.
Imports System.Net.Http
' Add the following Imports directive for System.Threading.
Imports System.Threading
Class MainWindow
' Declare a System.Threading.CancellationTokenSource.
Dim cts As CancellationTokenSource
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)
' Instantiate the CancellationTokenSource.
cts = New CancellationTokenSource()
resultsTextBox.Clear()
Try
' ***AccessTheWebAsync returns a Task, not a Task(Of Integer).
Await AccessTheWebAsync(cts.Token)
' ***Small change in the display lines.
resultsTextBox.Text &= vbCrLf & "Downloads complete."
Catch ex As OperationCanceledException
resultsTextBox.Text &= vbCrLf & "Downloads canceled." & vbCrLf
Catch ex As Exception
resultsTextBox.Text &= vbCrLf & "Downloads failed." & vbCrLf
End Try
' Set the CancellationTokenSource to Nothing when the download is complete.
cts = Nothing
End Sub
' Add an event handler for the Cancel button.
Private Sub cancelButton_Click(sender As Object, e As RoutedEventArgs)
If cts IsNot Nothing Then
cts.Cancel()
End If
End Sub
' Provide a parameter for the CancellationToken.
' ***Change the return type to Task because the method has no return statement.
Async Function AccessTheWebAsync(ct As CancellationToken) As Task
Dim client As HttpClient = New HttpClient()
' ***Call SetUpURLList to make a list of web addresses.
Dim urlList As List(Of String) = SetUpURLList()
' ***Add a loop to process the list of web addresses.
For Each url In urlList
' GetAsync returns a Task(Of HttpResponseMessage).
' Argument ct carries the message if the Cancel button is chosen.
' ***Note that the Cancel button can cancel all remaining downloads.
Dim response As HttpResponseMessage = Await client.GetAsync(url, ct)
' Retrieve the website contents from the HttpResponseMessage.
Dim urlContents As Byte() = Await response.Content.ReadAsByteArrayAsync()
resultsTextBox.Text &=
vbCrLf & $"Length of the downloaded string: {urlContents.Length}." & vbCrLf
Next
End Function
' ***Add a method that creates a list of web addresses.
Private Function SetUpURLList() As List(Of String)
Dim urls = New List(Of String) From
{
"https://msdn.microsoft.com",
"https://msdn.microsoft.com/library/hh290138.aspx",
"https://msdn.microsoft.com/library/hh290140.aspx",
"https://msdn.microsoft.com/library/dd470362.aspx",
"https://msdn.microsoft.com/library/aa578028.aspx",
"https://msdn.microsoft.com/library/ms404677.aspx",
"https://msdn.microsoft.com/library/ff730837.aspx"
}
Return urls
End Function
End Class
' Output if you do not choose to cancel:
' Length of the downloaded string: 35939.
' Length of the downloaded string: 237682.
' Length of the downloaded string: 128607.
' Length of the downloaded string: 158124.
' Length of the downloaded string: 204890.
' Length of the downloaded string: 175488.
' Length of the downloaded string: 145790.
' Downloads complete.
' Sample output if you choose to cancel:
' Length of the downloaded string: 35939.
' Length of the downloaded string: 237682.
' Length of the downloaded string: 128607.
' Downloads canceled.
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: