Zrušení asynchronní úlohy nebo seznamu úkolů (Visual Basic)
Tlačítko, které můžete použít ke zrušení asynchronní aplikace, můžete nastavit, pokud nechcete čekat na dokončení. Podle příkladů v tomto tématu můžete přidat tlačítko zrušení do aplikace, která stáhne obsah jednoho webu nebo seznamu webů.
Příklady používají uživatelské rozhraní, které popisuje asynchronní aplikace (Visual Basic).
Poznámka:
Abyste mohli spustit příklady, musíte mít na počítači nainstalovanou sadu Visual Studio 2012 nebo novější a rozhraní .NET Framework 4.5 nebo novější.
Zrušení úkolu
První příklad přidruží tlačítko Zrušit k jediné úloze stahování. Pokud zvolíte tlačítko při stahování obsahu aplikace, stahování se zruší.
Stažení příkladu
Kompletní projekt Windows Presentation Foundation (WPF) si můžete stáhnout z asynchronní ukázky: Vyladění aplikace a pak postupujte podle těchto kroků.
Dekomprimujte soubor, který jste stáhli, a spusťte Visual Studio.
Na řádku nabídek zvolte Soubor, Otevřít, Projekt nebo Řešení.
V dialogovém okně Otevřít projekt otevřete složku obsahující ukázkový kód, který jste dekomprimovali, a pak otevřete soubor řešení (.sln) pro AsyncFineTuningVB.
V Průzkumník řešení otevřete místní nabídku projektu CancelATask a pak zvolte Nastavit jako spouštěcí projekt.
Zvolte klávesu F5, aby se projekt spustil.
Pokud chcete projekt spustit bez ladění, zvolte klávesy Ctrl+F5.
Pokud si projekt nechcete stáhnout, můžete si projít MainWindow.xaml.vb soubory na konci tohoto tématu.
Sestavení příkladu
Následující změny přidají tlačítko Storno do aplikace, která stáhne web. Pokud nechcete stáhnout nebo sestavit příklad, můžete si projít konečný produkt v části Kompletní příklady na konci tohoto tématu. Hvězdičky označují změny v kódu.
Pokud chcete sestavit příklad sami, postupujte krok za krokem podle pokynů v části "Stažení příkladu", ale místo CancelATask zvolte StarterCode jako počáteční projekt.
Potom do souboru MainWindow.xaml.vb tohoto projektu přidejte následující změny.
Deklarujte proměnnou
CancellationTokenSource
,cts
která je v oboru pro všechny metody, které k ní přistupují.Class MainWindow ' ***Declare a System.Threading.CancellationTokenSource. Dim cts As CancellationTokenSource
Přidejte následující obslužnou rutinu události pro tlačítko Storno . Obslužná rutina události používá metodu CancellationTokenSource.Cancel k upozorňovat
cts
, když uživatel požádá o zrušení.' ***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
Proveďte následující změny v obslužné rutině události pro tlačítko Start ,
startButton_Click
.CancellationTokenSource
Vytvořte instanci ,cts
.' ***Instantiate the CancellationTokenSource. cts = New CancellationTokenSource()
Ve volání
AccessTheWebAsync
, který stáhne obsah zadaného webu, odeslat CancellationTokenSource.Token vlastnostcts
jako argument. VlastnostToken
rozšíří zprávu, pokud je požadováno zrušení. Přidejte blok catch, který zobrazí zprávu, pokud se uživatel rozhodne operaci stahování zrušit. Následující kód ukazuje změny.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
V
AccessTheWebAsync
, použít HttpClient.GetAsync(String, CancellationToken) přetíženíGetAsync
metody v HttpClient typu ke stažení obsahu webu. Předejtect
parametr CancellationToken parametruAccessTheWebAsync
, jako druhý argument. Token přenese zprávu, pokud uživatel zvolí tlačítko Zrušit .Následující kód ukazuje změny v
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
Pokud program nezrušíte, vytvoří se následující výstup:
Ready to download. Length of the downloaded string: 158125.
Pokud před stažením obsahu program vyberete tlačítko Storno , program vytvoří následující výstup:
Ready to download. Download canceled.
Zrušení seznamu úkolů
Předchozí příklad můžete rozšířit tak, aby se zrušilo mnoho úkolů tím, že přidružíte stejnou CancellationTokenSource
instanci ke každému úkolu. Pokud zvolíte tlačítko Zrušit , zrušíte všechny úkoly, které ještě nejsou dokončené.
Stažení příkladu
Kompletní projekt Windows Presentation Foundation (WPF) si můžete stáhnout z asynchronní ukázky: Vyladění aplikace a pak postupujte podle těchto kroků.
Dekomprimujte soubor, který jste stáhli, a spusťte Visual Studio.
Na řádku nabídek zvolte Soubor, Otevřít, Projekt nebo Řešení.
V dialogovém okně Otevřít projekt otevřete složku obsahující ukázkový kód, který jste dekomprimovali, a pak otevřete soubor řešení (.sln) pro AsyncFineTuningVB.
V Průzkumník řešení otevřete místní nabídku projektu CancelAListOfTasks a pak zvolte Nastavit jako spouštěcí projekt.
Zvolte klávesu F5, aby se projekt spustil.
Pokud chcete projekt spustit bez ladění, zvolte klávesy Ctrl+F5.
Pokud si projekt nechcete stáhnout, můžete si projít MainWindow.xaml.vb soubory na konci tohoto tématu.
Sestavení příkladu
Pokud chcete příklad rozšířit sami, postupujte krok za krokem podle pokynů v části Stažení příkladu, ale jako počáteční projekt zvolte CancelATask. Do tohoto projektu přidejte následující změny. Hvězdičky označují změny v programu.
Přidejte metodu pro vytvoření seznamu webových adres.
' ***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
Volání metody v
AccessTheWebAsync
.' ***Call SetUpURLList to make a list of web addresses. Dim urlList As List(Of String) = SetUpURLList()
Přidejte následující smyčku
AccessTheWebAsync
pro zpracování každé webové adresy v seznamu.' ***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
Vzhledem k tomu
AccessTheWebAsync
, že se zobrazí délky, metoda nemusí nic vracet. Odeberte návratový příkaz a změňte návratový typ metody na Task místo Task<TResult>.Async Function AccessTheWebAsync(ct As CancellationToken) As Task
Volejte metodu z
startButton_Click
příkazu namísto výrazu.Await AccessTheWebAsync(cts.Token)
Pokud program nezrušíte, vytvoří se následující výstup:
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.
Pokud před dokončením stahování zvolíte tlačítko Zrušit , bude výstup obsahovat délky stahování, které se dokončily před zrušením.
Length of the downloaded string: 35939. Length of the downloaded string: 237682. Length of the downloaded string: 128607. Downloads canceled.
Kompletní příklady
Následující části obsahují kód pro každý z předchozích příkladů. Všimněte si, že je nutné přidat odkaz pro System.Net.Http.
Projekty si můžete stáhnout z ukázky Async: Vyladění aplikace.
Příklad zrušení úlohy
Následující kód je úplný MainWindow.xaml.vb soubor pro příklad, který zruší jeden úkol.
' 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říklad zrušení seznamu úloh
Následující kód je úplný MainWindow.xaml.vb soubor pro příklad, který zruší seznam úkolů.
' 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.