Cancelar tarefas assíncronas após um período de tempo (Visual Basic)
Você pode cancelar uma operação assíncrona após um período de tempo usando o CancellationTokenSource.CancelAfter método se não quiser esperar que a operação seja concluída. Este método agenda o cancelamento de quaisquer tarefas associadas que não sejam concluídas dentro do período de tempo designado pela CancelAfter
expressão.
Este exemplo adiciona ao código desenvolvido em Cancelar uma tarefa assíncrona ou uma lista de tarefas (Visual Basic) para baixar uma lista de sites e exibir o comprimento do conteúdo de cada um.
Nota
Para executar os exemplos, você deve ter o Visual Studio 2012 ou posterior e o .NET Framework 4.5 ou posterior instalado no seu computador.
Download do exemplo
Você pode baixar o projeto completo do Windows Presentation Foundation (WPF) de Async Sample: Fine Tuning Your Application e siga estas etapas.
Descompacte o arquivo que você baixou e, em seguida, inicie o Visual Studio.
Na barra de menus, escolha Arquivo, Abrir, Projeto/Solução.
Na caixa de diálogo Abrir projeto, abra a pasta que contém o código de exemplo que você descompactou e, em seguida, abra o arquivo de solução (.sln) para AsyncFineTuningVB.
No Gerenciador de Soluções, abra o menu de atalho para o projeto CancelAfterTime e escolha Definir como Projeto de Inicialização.
Escolha a tecla F5 para executar o projeto.
Escolha as teclas Ctrl+F5 para executar o projeto sem depurá-lo.
Execute o programa várias vezes para verificar se a saída pode mostrar a saída para todos os sites, nenhum site ou alguns sites.
Se não quiser baixar o projeto, você pode revisar o arquivo de MainWindow.xaml.vb no final deste tópico.
Construindo o exemplo
O exemplo neste tópico adiciona ao projeto desenvolvido em Cancelar uma tarefa assíncrona ou uma lista de tarefas (Visual Basic) para cancelar uma lista de tarefas. O exemplo usa a mesma interface do usuário, embora o botão Cancelar não seja usado explicitamente.
Para construir o exemplo você mesmo, passo a passo, siga as instruções na seção "Baixando o exemplo", mas escolha CancelAListOfTasks como o projeto de inicialização. Adicione as alterações neste tópico a esse projeto.
Para especificar um tempo máximo antes que as tarefas sejam marcadas como canceladas, adicione uma chamada ao CancelAfter
startButton_Click
, como mostra o exemplo a seguir. A adição está marcada com asteriscos.
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
Execute o programa várias vezes para verificar se a saída pode mostrar a saída para todos os sites, nenhum site ou alguns sites. A saída a seguir é um exemplo:
Length of the downloaded string: 35990.
Length of the downloaded string: 407399.
Length of the downloaded string: 226091.
Downloads canceled.
Exemplo completo
O código a seguir é o texto completo do arquivo MainWindow.xaml.vb para o exemplo. Asteriscos marcam os elementos que foram adicionados para este exemplo.
Observe que você deve adicionar uma referência para System.Net.Http.
Você pode baixar o projeto de Async Sample: Fine Tuning Your Application.
' 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.