다음을 통해 공유


일정 기간 후 비동기 작업 취소(Visual Basic)

작업이 완료되기를 기다리지 않으려는 경우 메서드를 사용하여 CancellationTokenSource.CancelAfter 일정 기간 후에 비동기 작업을 취소할 수 있습니다. 이 메서드는 CancelAfter 표현식에 의해 지정된 기간 내에 완료되지 않은 관련 작업의 취소를 스케줄 합니다.

이 예제에서는 비동기 작업 취소 또는 작업 목록(Visual Basic) 에서 개발된 코드에 추가하여 웹 사이트 목록을 다운로드하고 각 웹 사이트의 콘텐츠 길이를 표시합니다.

비고

예제를 실행하려면 Visual Studio 2012 이상과 .NET Framework 4.5 이상이 컴퓨터에 설치되어 있어야 합니다.

예제 다운로드

비동기 샘플: 애플리케이션 미세 조정에서 전체 WPF(Windows Presentation Foundation) 프로젝트를 다운로드한 다음 다음 단계를 수행할 수 있습니다.

  1. 다운로드한 파일의 압축을 해제한 다음 Visual Studio를 시작합니다.

  2. 메뉴 모음에서 파일, 열기, 프로젝트/솔루션을 선택합니다.

  3. 프로젝트 열기 대화 상자에서 압축을 푼 샘플 코드가 들어 있는 폴더를 연 다음 AsyncFineTuningVB에 대한 솔루션(.sln) 파일을 엽니다.

  4. 솔루션 탐색기에서 CancelAfterTime 프로젝트의 바로 가기 메뉴를 연 다음 시작 프로젝트로 설정을 선택합니다.

  5. F5 키를 선택하여 프로젝트를 실행합니다.

    프로젝트를 디버깅하지 않고 실행하려면 Ctrl+F5 키를 선택합니다.

  6. 프로그램을 여러 번 실행하여 출력에 모든 웹 사이트에 대한 결과, 웹 사이트가 없는 결과, 또는 일부 웹 사이트에 대한 결과가 표시될 수 있는지를 확인하세요.

프로젝트를 다운로드하지 않으려면 이 항목의 끝에 MainWindow.xaml.vb 파일을 검토할 수 있습니다.

예제를 구축하기

이 항목의 예제에서는 비동기 작업 취소 또는 작업 목록(Visual Basic) 에서 개발된 프로젝트에 추가하여 작업 목록을 취소합니다. 이 예제에서는 취소 단추가 명시적으로 사용되지는 않지만 동일한 UI를 사용합니다.

예제를 직접 빌드하려면 단계별로 "예제 다운로드" 섹션의 지침에 따라 시작 프로젝트CancelAListOfTasks를 선택합니다. 이 항목의 변경 내용을 해당 프로젝트에 추가합니다.

작업이 취소된 것으로 표시되기까지의 최대 시간을 지정하려면 다음 예제와 같이 호출을 CancelAfterstartButton_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에 대한 참조를 추가해야 함을 알아두세요.

비동기 샘플: 애플리케이션 미세 조정에서 프로젝트를 다운로드할 수 있습니다.

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

참고하십시오