CancellationTokenSource.CancelAfter メソッドを使用して、操作が完了するまで待機しない場合は、一定期間後に非同期操作を取り消すことができます。 このメソッドは、 CancelAfter
式によって指定された期間内に完了していない関連タスクの取り消しをスケジュールします。
この例では、「 非同期タスクの取り消し」または「タスクのリスト (Visual Basic)」 で開発したコードを追加して、Web サイトの一覧をダウンロードし、それぞれのコンテンツの長さを表示します。
注
この例を実行するには、Visual Studio 2012 以降と .NET Framework 4.5 以降がコンピューターにインストールされている必要があります。
サンプルをダウンロード
完全な Windows Presentation Foundation (WPF) プロジェクトは 、非同期サンプル: アプリケーションの微調整 からダウンロードし、次の手順に従います。
ダウンロードしたファイルを展開し、Visual Studio を起動します。
メニュー バーで、[ ファイル]、[ 開く]、[ プロジェクト/ソリューション] の順に選択します。
[ プロジェクトを開く ] ダイアログ ボックスで、展開したサンプル コードを保持するフォルダーを開き、AsyncFineTuningVB のソリューション (.sln) ファイルを開きます。
ソリューション エクスプローラーで、CancelAfterTime プロジェクトのショートカット メニューを開き、[スタートアップ プロジェクトとして設定] を選択します。
F5 キーを押してプロジェクトを実行します。
Ctrl キーを押しながら F5 キーを押して、プロジェクトをデバッグせずに実行します。
プログラムを複数回実行して、出力がすべてのウェブサイト、ウェブサイトなし、または一部のウェブサイトについて表示される可能性があることを確認します。
プロジェクトをダウンロードしない場合は、このトピックの最後にあるMainWindow.xaml.vb ファイルを確認できます。
例を構築する
このトピックの例では、「 非同期タスクの取り消し」または「タスクの一覧 (Visual Basic)」 で開発したプロジェクトに追加して、タスクの一覧を取り消します。 この例では同じ UI を使用しますが、[ キャンセル ] ボタンは明示的には使用されません。
サンプルを自分でビルドするには、「サンプルのダウンロード」セクションの手順に従いますが、スタートアップ プロジェクトとして 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の参照を追加する必要があることに注意してください。
非同期サンプル: アプリケーションの微調整からプロジェクトをダウンロードできます。
' 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.
こちらも参照ください
.NET