Anulowanie zadań po upływie określonego czasu (C# i Visual Basic)
Można anulować operację asynchroniczną, po upływie określonego czasu za pomocą CancellationTokenSource.CancelAfter metodę, jeśli nie chcesz czekać na zakończenie operacji.Ta metoda planuje anulowanie skojarzonymi zadaniami, które nie są kompletne w terminie wyznaczonym przez CancelAfter wyrażenie.
W tym przykładzie dodaje do kodu, który będzie rozwijany w Anulowanie zadania lub listy zadań (C# i Visual Basic) Aby pobrać listę witryn sieci Web i wyświetlić długość zawartości każdego z nich.
[!UWAGA]
Aby uruchomić przykłady, musisz mieć program Visual Studio 2012 r., programu Visual Studio Express 2012 dla pulpitu systemu Windows, lub 4.5.NET Framework zainstalowana na komputerze.
Pobieranie w przykładzie
Można pobrać pełne projektu Windows Presentation Foundation (WPF) z próbki asynchroniczne: dobrze strojenia Twoja aplikacja a następnie wykonaj poniższe kroki.
Zdekompresuj plik, który zostanie pobrany, a następnie uruchom Visual Studio 2012.
Na pasku menu wybierz kolejno opcje Plik, Otwórz i Projekt/rozwiązanie.
W Otwórz projekt okno dialogowe Otwórz folder, który posiada przykładowy kod, który zostanie zdekompresowany, a następnie otwórz plik rozwiązania (.sln) dla AsyncFineTuningCS lub AsyncFineTuningVB.
W Solution Explorer, otwórz menu skrótów dla CancelAfterTime projektu, a następnie wybierz jako projekt uruchamiania.
Wybierz klawisz F5, aby uruchomić projekt.
Wybierz klawisze Ctrl + F5, aby uruchomić projekt bez jej debugowaniem.
Aby zweryfikować, że dane wyjściowe może pokazać dane wyjściowe dla wszystkich witryn sieci Web, witryn sieci Web lub witryn sieci web, należy uruchomić program kilka razy.
Jeśli nie chcesz pobrać projektu, można przejrzeć pliki MainWindow.xaml.vb i MainWindow.xaml.cs na końcu tego tematu.
W przykładzie budynku
W przykładzie w tym temacie dodawany do projektu, opracowanym w Anulowanie zadania lub listy zadań (C# i Visual Basic) Aby anulować listy zadań.W przykładzie użyto tego samego interfejsu użytkownika, mimo że anulowanie nie jest jawnie użyć przycisku.
Zbudować przykładzie samodzielnie, krok po kroku, postępuj zgodnie z instrukcjami w sekcji "Pobieranie Example", ale wybrać CancelAListOfTasks jako Projekt uruchamiania.Dodaj odpowiednie zmiany w tym temacie do tego projektu.
Aby określić maksymalny czas, zanim zadania są oznaczone jako anulowane, dodać wywołanie CancelAfter do startButton_Click, jak w poniższym przykładzie.Dodanie jest oznaczone gwiazdkami.
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
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// 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 += "\r\nDownloads succeeded.\r\n";
}
catch (OperationCanceledException)
{
resultsTextBox.Text += "\r\nDownloads canceled.\r\n";
}
catch (Exception)
{
resultsTextBox.Text += "\r\nDownloads failed.\r\n";
}
cts = null;
}
Aby zweryfikować, że dane wyjściowe może pokazać dane wyjściowe dla wszystkich witryn sieci Web, witryn sieci Web lub witryn sieci web, należy uruchomić program kilka razy.Następujące dane wyjściowe jest próbka.
Length of the downloaded string: 35990.
Length of the downloaded string: 407399.
Length of the downloaded string: 226091.
Downloads canceled.
Kompletny przykład
Poniższy kod jest pełny tekst w pliku MainWindow.xaml.vb lub MainWindow.xaml.cs, na przykład.Gwiazdki oznaczyć elementy, które zostały dodane w tym przykładzie.
Należy zauważyć, że należy dodać punkt odniesienia dla System.Net.Http.
Można pobrać projektu z próbki asynchroniczne: dobrze strojenia Twoja aplikacja.
' 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 &=
String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, urlContents.Length)
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/en-us/library/hh290138.aspx",
"https://msdn.microsoft.com/en-us/library/hh290140.aspx",
"https://msdn.microsoft.com/en-us/library/dd470362.aspx",
"https://msdn.microsoft.com/en-us/library/aa578028.aspx",
"https://msdn.microsoft.com/en-us/library/ms404677.aspx",
"https://msdn.microsoft.com/en-us/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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// Add a using directive and a reference for System.Net.Http.
using System.Net.Http;
// Add the following using directive.
using System.Threading;
namespace CancelAfterTime
{
public partial class MainWindow : Window
{
// Declare a System.Threading.CancellationTokenSource.
CancellationTokenSource cts;
public MainWindow()
{
InitializeComponent();
}
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// 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 += "\r\nDownloads succeeded.\r\n";
}
catch (OperationCanceledException)
{
resultsTextBox.Text += "\r\nDownloads canceled.\r\n";
}
catch (Exception)
{
resultsTextBox.Text += "\r\nDownloads failed.\r\n";
}
cts = null;
}
// You can still include a Cancel button if you want to.
private void cancelButton_Click(object sender, RoutedEventArgs e)
{
if (cts != null)
{
cts.Cancel();
}
}
async Task AccessTheWebAsync(CancellationToken ct)
{
// Declare an HttpClient object.
HttpClient client = new HttpClient();
// Make a list of web addresses.
List<string> urlList = SetUpURLList();
foreach (var url in urlList)
{
// GetAsync returns a Task<HttpResponseMessage>.
// Argument ct carries the message if the Cancel button is chosen.
// Note that the Cancel button cancels all remaining downloads.
HttpResponseMessage response = await client.GetAsync(url, ct);
// Retrieve the website contents from the HttpResponseMessage.
byte[] urlContents = await response.Content.ReadAsByteArrayAsync();
resultsTextBox.Text +=
String.Format("\r\nLength of the downloaded string: {0}.\r\n", urlContents.Length);
}
}
private List<string> SetUpURLList()
{
List<string> urls = new List<string>
{
"https://msdn.microsoft.com",
"https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
"https://msdn.microsoft.com/en-us/library/hh290136.aspx",
"https://msdn.microsoft.com/en-us/library/ee256749.aspx",
"https://msdn.microsoft.com/en-us/library/ms404677.aspx",
"https://msdn.microsoft.com/en-us/library/ff730837.aspx"
};
return urls;
}
}
// Sample Output:
// Length of the downloaded string: 35990.
// Length of the downloaded string: 407399.
// Length of the downloaded string: 226091.
// Downloads canceled.
}
Zobacz też
Zadania
Instruktaż: Dostęp do sieci Web za pomocą transmisji asynchronicznej i poczekać (C# i Visual Basic)
Koncepcje
Asynchroniczne programowania przy użyciu asynchronicznej i poczekać (C# i Visual Basic)
Anulowanie zadania lub listy zadań (C# i Visual Basic)
Dostrajanie aplikacji Async (C# i Visual Basic)