Asynchrone Aufgaben nach einer Zeitperiode abbrechen (C#)Cancel Async Tasks after a Period of Time (C#)

Sie können einen asynchronen Vorgang nach einem gewissen Zeitraum mithilfe der CancellationTokenSource.CancelAfter-Methode abbrechen, wenn Sie nicht auf das Ende des Vorgangs warten möchten.You can cancel an asynchronous operation after a period of time by using the CancellationTokenSource.CancelAfter method if you don't want to wait for the operation to finish. Diese Methode plant den Abbruch aller zugeordneten Aufgaben, die innerhalb des vom CancelAfter-Ausdruck festgelegten Zeitraums nicht abgeschlossen sind.This method schedules the cancellation of any associated tasks that aren’t complete within the period of time that’s designated by the CancelAfter expression.

Dieses Beispiel fügt dem in Eine asynchrone Aufgabe oder Aufgabenliste abbrechen (C#) entwickelten Code Funktionen zum Herunterladen einer Liste von Websites und Anzeigen der Länge der Inhalte jeder Site hinzu.This example adds to the code that’s developed in Cancel an Async Task or a List of Tasks (C#) to download a list of websites and to display the length of the contents of each one.

Hinweis

Zum Ausführen der Beispiele müssen Visual Studio 2012 oder höher sowie .NET Framework 4.5 oder höher auf dem Computer installiert sein.To run the examples, you must have Visual Studio 2012 or newer and the .NET Framework 4.5 or newer installed on your computer.

Herunterladen des BeispielsDownloading the Example

Sie können das vollständige Windows Presentation Foundation (WPF)-Projekt von Async Sample: Fine Tuning Your Application herunterladen und anschließend die folgenden Schritte ausführen.You can download the complete Windows Presentation Foundation (WPF) project from Async Sample: Fine Tuning Your Application and then follow these steps.

  1. Dekomprimieren Sie die heruntergeladene Datei, und starten Sie dann Visual Studio.Decompress the file that you downloaded, and then start Visual Studio.

  2. Klicken Sie in der Menüleiste auf Datei, dann auf Öffnenund Projekt/Projektmappe.On the menu bar, choose File, Open, Project/Solution.

  3. Öffnen Sie im Dialogfeld Projekt öffnen den Ordner, der den von Ihnen dekomprimierten Beispielcode enthält, und öffnen Sie anschließend die Projektmappendatei (SLN-Datei) für AsyncFineTuningCS oder AsyncFineTuningVB.In the Open Project dialog box, open the folder that holds the sample code that you decompressed, and then open the solution (.sln) file for AsyncFineTuningCS.

  4. Öffnen Sie im Projektmappen-Explorer das Kontextmenü für das CancelAfterTime-Projekt und wählen dann Als Startprojekt festlegen aus.In Solution Explorer, open the shortcut menu for the CancelAfterTime project, and then choose Set as StartUp Project.

  5. Drücken Sie die Taste F5, um das Projekt auszuführen.Choose the F5 key to run the project.

    Drücken Sie STRG+F5, um das Projekt auszuführen, ohne es zu debuggen.Choose the Ctrl+F5 keys to run the project without debugging it.

  6. Führen Sie das Programm mehrmals aus, und überprüfen Sie dabei, ob die Ausgabe für alle, keine oder einige Websites angezeigt wird.Run the program several times to verify that the output might show output for all websites, no websites, or some web sites.

Wenn Sie das Projekt nicht herunterladen möchten, können Sie die Datei „MainWindow.xaml.cs“ am Ende dieses Themas überprüfen.If you don't want to download the project, you can review the MainWindow.xaml.cs file at the end of this topic.

Erstellen des BeispielsBuilding the Example

Das Beispiel in diesem Thema baut auf dem Projekt auf, das unter Eine asynchrone Aufgabe oder Aufgabenliste abbrechen (C#) entwickelt wurde, um eine Aufgabenliste abzubrechen.The example in this topic adds to the project that's developed in Cancel an Async Task or a List of Tasks (C#) to cancel a list of tasks. Im Beispiel wird die gleiche UI verwendet, obwohl die Schaltfläche Abbrechen nicht explizit verwendet wird.The example uses the same UI, although the Cancel button isn’t used explicitly.

Um das Beispiel selbst schrittweise zu erstellen, befolgen Sie die Anweisungen im Abschnitt „Herunterladen des Beispiels“. Wählen Sie als Startprojekt aber CancelAListOfTasks aus.To build the example yourself, step by step, follow the instructions in the "Downloading the Example" section, but choose CancelAListOfTasks as the StartUp Project. Fügen Sie diesem Projekt die Änderungen in diesem Thema hinzu.Add the changes in this topic to that project.

Zum Angeben einer maximalen Zeitspanne bis zum Abbrechen der Aufgaben fügen Sie den Aufruf von CancelAfter in startButton_Click hinzu, wie im folgenden Beispiel gezeigt.To specify a maximum time before the tasks are marked as canceled, add a call to CancelAfter to startButton_Click, as the following example shows. Die Ergänzung ist mit Sternchen gekennzeichnet.The addition is marked with asterisks.

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;   
}  

Führen Sie das Programm mehrmals aus, und überprüfen Sie dabei, ob die Ausgabe für alle, keine oder einige Websites angezeigt wird.Run the program several times to verify that the output might show output for all websites, no websites, or some web sites. Die folgende Ausgabe ist beispielhaft.The following output is a sample.

Length of the downloaded string: 35990.  

Length of the downloaded string: 407399.  

Length of the downloaded string: 226091.  

Downloads canceled.  

Vollständiges BeispielComplete Example

Der folgende Code besteht aus dem vollständigen Text der Datei „MainWindow.xaml.cs“ für das Beispiel.The following code is the complete text of the MainWindow.xaml.cs file for the example. Sternchen markieren die Elemente, die für dieses Beispiel hinzugefügt wurden.Asterisks mark the elements that were added for this example.

Beachten Sie, dass Sie einen Verweis für System.Net.Http hinzufügen müssen.Notice that you must add a reference for System.Net.Http.

Sie können das Projekt von Async Sample: Fine Tuning Your Application herunterladen.You can download the project from Async Sample: Fine Tuning Your Application.

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>   
            {   
                "http://msdn.microsoft.com",  
                "http://msdn.microsoft.com/library/windows/apps/br211380.aspx",  
                "http://msdn.microsoft.com/library/hh290136.aspx",  
                "http://msdn.microsoft.com/library/ee256749.aspx",  
                "http://msdn.microsoft.com/library/ms404677.aspx",  
                "http://msdn.microsoft.com/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.  
}  

Siehe auchSee Also

Asynchronous Programming with async and await (C#) (Asynchrone Programmierung mit Async und Await (C#))Asynchronous Programming with async and await (C#)
Exemplarische Vorgehensweise: Zugreifen auf das Web mit „async“ und „await“ (C#)Walkthrough: Accessing the Web by Using async and await (C#)
Brechen Sie eine asynchrone Aufgabe oder eine Liste von Aufgaben (c#)Cancel an Async Task or a List of Tasks (C#)
Feinabstimmung der Async-Anwendung (C#)Fine-Tuning Your Async Application (C#)
Async Sample: Fine Tuning Your Application (Async-Beispiel: Feinabstimmung der Anwendung)Async Sample: Fine Tuning Your Application