Поделиться через


Отмена асинхронных задач после периода времени (Visual Basic)

Вы можете отменить асинхронную операцию через период времени, используя CancellationTokenSource.CancelAfter метод, если вы не хотите ожидать завершения операции. Этот метод планирует отмену связанных задач, которые не выполняются в течение периода времени, указанного выражением CancelAfter .

В этом примере добавляется код, разработанный в разделе "Отмена асинхронной задачи" или "Список задач" (Visual Basic), чтобы скачать список веб-сайтов и отобразить длину содержимого каждого из них.

Замечание

Для выполнения примеров необходимо установить Visual Studio 2012 или более поздней версии и .NET Framework 4.5 или более поздней версии на компьютере.

Скачивание примера

Вы можете скачать полный проект Windows Presentation Foundation (WPF) из примера Async: настройки вашего приложения и затем выполните следующие действия.

  1. Распакуйте скачанный файл и запустите Visual Studio.

  2. В строке меню выберите "Файл", "Открыть", "Проект или решение".

  3. В диалоговом окне "Открыть проект" откройте папку, содержащую пример кода, который вы распаковали, а затем откройте файл решения (.sln) для AsyncFineTuningVB.

  4. В обозревателе решений откройте контекстное меню для проекта CancelAfterTime и выберите "Задать как проект запуска".

  5. Выберите клавишу F5 для запуска проекта.

    Выберите клавиши CTRL+F5, чтобы запустить проект без отладки.

  6. Запустите программу несколько раз, чтобы убедиться, что выходные данные могут отображаться для всех веб-сайтов, нет веб-сайтов или некоторых веб-сайтов.

Если вы не хотите скачать проект, просмотрите файл MainWindow.xaml.vb в конце этого раздела.

Создание примера

Пример в этом разделе добавляется к проекту, который разработан в теме "Отмена асинхронной задачи или списка задач" (Visual Basic), для отмены списка задач. В примере используется тот же пользовательский интерфейс, хотя кнопка "Отмена " не используется явно.

Чтобы создать пример самостоятельно, следуйте пошаговым инструкциям в разделе "Скачивание примера", но выберите CancelAListOfTasks в качестве Основного проекта. Добавьте изменения из этой темы в тот проект.

Чтобы указать максимальное время, прежде чем задачи будут помечены как отмененные, как показано в следующем примере, добавьте вызов CancelAfter в startButton_Click. Добавление помечается звездочками.

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

Запустите программу несколько раз, чтобы убедиться, что выходные данные могут отображаться для всех веб-сайтов, нет веб-сайтов или некоторых веб-сайтов. Ниже приведен пример выходных данных:

Length of the downloaded string: 35990.

Length of the downloaded string: 407399.

Length of the downloaded string: 226091.

Downloads canceled.

Полный пример

Следующий код представляет собой полный текст файла MainWindow.xaml.vb для примера. Звездочки помечают элементы, добавленные в этот пример.

Обратите внимание, что необходимо добавить ссылку для System.Net.Http.

Проект можно скачать из примера Async: тонкая настройка вашего приложения.

' 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.

См. также