Avbryt Async-aktiviteter efter en tidsperiod (Visual Basic)
Du kan avbryta en asynkron åtgärd efter en viss tidsperiod med hjälp CancellationTokenSource.CancelAfter av metoden om du inte vill vänta tills åtgärden har slutförts. Den här metoden schemalägger annulleringen av associerade aktiviteter som inte har slutförts inom den tidsperiod som anges av CancelAfter
uttrycket.
Det här exemplet lägger till koden som har utvecklats i Avbryt en Async-uppgift eller en lista över uppgifter (Visual Basic) för att ladda ned en lista över webbplatser och visa längden på innehållet i var och en.
Kommentar
Om du vill köra exemplen måste du ha Visual Studio 2012 eller senare och .NET Framework 4.5 eller senare installerat på datorn.
Ladda ned exemplet
Du kan ladda ned hela WPF-projektet (Windows Presentation Foundation) från Async Sample: Fine Tuning Your Application och sedan följa dessa steg.
Expandera filen som du laddade ned och starta sedan Visual Studio.
På menyraden väljer du Arkiv, Öppna, Projekt/Lösning.
I dialogrutan Öppna projekt öppnar du mappen som innehåller exempelkoden som du dekomprimerade och öppnar sedan lösningsfilen (.sln) för AsyncFineTuningVB.
I Solution Explorer öppnar du snabbmenyn för projektet CancelAfterTime och väljer sedan Ange som StartUp-projekt.
Välj F5-nyckeln för att köra projektet.
Välj Ctrl+F5-tangenterna för att köra projektet utan att felsöka det.
Kör programmet flera gånger för att kontrollera att utdata kan visa utdata för alla webbplatser, inga webbplatser eller vissa webbplatser.
Om du inte vill ladda ned projektet kan du granska filen MainWindow.xaml.vb i slutet av det här avsnittet.
Skapa exemplet
Exemplet i det här avsnittet lägger till i projektet som har utvecklats i Avbryt en Async-uppgift eller en lista över uppgifter (Visual Basic) för att avbryta en lista över aktiviteter. I exemplet används samma användargränssnitt, även om knappen Avbryt inte används explicit.
Om du vill skapa exemplet själv följer du anvisningarna i avsnittet "Ladda ned exemplet" steg för steg, men väljer AvbrytAListOfTasks som StartUp-projekt. Lägg till ändringarna i det här avsnittet i projektet.
Om du vill ange en maximal tid innan aktiviteterna markeras som avbrutna lägger du till ett anrop till CancelAfter
i startButton_Click
, som i följande exempel visas. Tillägget är markerat med asterisker.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)
' Instantiate the CancellationTokenSource.
cts = New CancellationTokenSource()
resultsTextBox.Clear()
Try
' ***Set up the CancellationTokenSource to cancel after 2.5 seconds. (You
' can adjust the time.)
cts.CancelAfter(2500)
Await AccessTheWebAsync(cts.Token)
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
Kör programmet flera gånger för att kontrollera att utdata kan visa utdata för alla webbplatser, inga webbplatser eller vissa webbplatser. Följande utdata är ett exempel:
Length of the downloaded string: 35990.
Length of the downloaded string: 407399.
Length of the downloaded string: 226091.
Downloads canceled.
Fullständigt exempel
Följande kod är den fullständiga texten i MainWindow.xaml.vb-filen för exemplet. Asterisker markerar de element som lades till i det här exemplet.
Observera att du måste lägga till en referens för System.Net.Http.
Du kan ladda ned projektet från Async Sample: Finjustering av ditt program.
' 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
' ***Set up the CancellationTokenSource to cancel after 2.5 seconds. (You
' can adjust the time.)
cts.CancelAfter(2500)
Await AccessTheWebAsync(cts.Token)
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
' You can still include a Cancel button if you want to.
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()
' Process each element in 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
' Sample output:
' Length of the downloaded string: 35990.
' Length of the downloaded string: 407399.
' Length of the downloaded string: 226091.
' Downloads canceled.