(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Asynchrone Programmierung mit Async und Await (C# und Visual Basic)

Sie können Leistungsengpässe vermeiden und die gesamte Reaktionszeit der Anwendung erhöhen, indem Sie asynchrone Programmierung verwenden. Allerdings können herkömmliche Verfahren zum Schreiben von asynchronen Anwendungen schwierig und dazu führen zu schreiben, zu debuggen und zu verwalten.

Visual Studio 2012 stellt einen vereinfachten Ansatz, asynchrone Programmierung vor, die asynchrone Unterstützung in .NET Framework 4.5 und in Windows-Runtime nutzt. Der Compiler erledigt die schwierige Aufgaben, die der Entwickler, der verwendet wird, um auf, und die Anwendung eine logische Struktur beibehält, die synchronem Code ähnelt. Daher rufen Sie alle Vorteile der asynchronen Programmierung mit einem Bruchteil Aufwand ab.

Dieses Thema enthält folgende Abschnitte.

Dieses Thema enthält eine Übersicht über wann und wie asynchrone Programmierung verwendet und umfasst Links, um Themen zu unterstützen, die Informationen und Beispiele enthalten.

Asynchrony ist für Aktivitäten äußerst wichtig, die blockiert möglicherweise sind, beispielsweise, wenn die Anwendung auf das Internet zugreift. Zugriff auf eine Webressource ist manchmal langsam oder verzögert. Wenn eine solche Aktivität innerhalb eines synchronen Prozesses blockiert wird, muss die gesamte Anwendung warten. In einem asynchronen Prozess kann die Anwendung mit anderer Aufgaben fortfahren, die nicht von der Webressource abhängt, bis die blockiert möglicherweise Aufgabe beendet.

In der folgenden Tabelle werden typische Bereichen angezeigt, in denen asynchrone Programmierung Reaktionsgeschwindigkeit verbessert. Das aufgelistete API von .NET Framework 4.5 und Windows-Runtime enthalten Methoden, die asynchrone Programmierung unterstützen.

Anwendungsbereich

APIs unterstützen, das asynchrone Methoden enthalten

Webzugriff

HttpClient , SyndicationClient

Arbeiten mit Dateien

StorageFile, StreamWriter, StreamReader, XmlReader

Arbeiten mit Bildern

MediaCapture BitmapEncoder, BitmapDecoder

WCF-Programmierung

Synchrone und asynchrone Vorgänge

Arbeiten mit Sockets

Socket

Asynchrony Sampling besonders wertvolles für Anwendungen, die auf den UI-Thread zugreifen, da alle für Aktivität normalerweise einen Thread freigibt. Ist ein Prozess in einer synchronen Anwendung blockiert, so werden alle Prozesse blockiert. Die Anwendung reagiert nicht mehr, und Sie denken möglicherweise, es sei ein Fehler aufgetreten, obwohl die Anwendung tatsächlich nur wartet.

Wenn Sie asynchrone Methoden verwenden, wird die Anwendung weiter ausgeführt, um auf die Benutzeroberfläche zu reagieren. Sie können Größe ändern, oder, Fenster, beispielsweise, oder Sie zu minimieren kann die Anwendung schließen, wenn Sie nicht darauf warten möchten, um zu beenden.

Der asynchron-basierte Ansatz fügt die äquivalenten Automatikgetriebes der Liste von Optionen hinzu, die Sie auswählen können, wenn Sie asynchrone Vorgänge entwerfen. Das heißt, erhalten Sie alle Vorteile der herkömmlichen asynchronen Programmierung jedoch mit viel weniger Aufwand vom Entwickler ab.

Die Asynchrone und Rechnen Sie Schlüsselwörter in Visual Basic und die asynchron und Sie erwarten Schlüsselwörter in C# sind das Kernstück der asynchronen Programmierung. Wenn Sie diese beiden Schlüsselwörter verwenden, können Sie Ressourcen in .NET Framework oder in Windows-Runtime verwenden, um eine asynchrone Methode fast genauso einfach zu erstellen, wie Sie eine synchrone Methode erstellen. Asynchrone Methoden, die Sie definieren, indem Sie asynchron verwenden und erwarten, als asynchrone Methoden.

Im folgenden Beispiel wird eine asynchrone Methode an. Fast alle im Code sollte Ihnen vollständig vertrauenswürdig aussehen. Die Kommentare rufen die Funktionen aus, die Sie hinzufügen, um das asynchrony zu erstellen.

Die vollständige Beispieldatei finden Sie am Ende dieses Themas, und Sie können das Beispiel unter Thema mit einem Beispiel aus der asynchronen Programmierung mit "Async" und "Await" herunterladen.


// Three things to note in the signature:
//  - The method has an async modifier. 
//  - The return type is Task or Task<T>. (See "Return Types" section.)
//    Here, it is Task<int> because the return statement returns an integer.
//  - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{ 
    // You need to add a reference to System.Net.Http to declare client.
    HttpClient client = new HttpClient();

    // GetStringAsync returns a Task<string>. That means that when you await the
    // task you'll get a string (urlContents).
    Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");

    // You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork();

    // The await operator suspends AccessTheWebAsync.
    //  - AccessTheWebAsync can't continue until getStringTask is complete.
    //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
    //  - Control resumes here when getStringTask is complete. 
    //  - The await operator then retrieves the string result from getStringTask.
    string urlContents = await getStringTask;

    // The return statement specifies an integer result.
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    return urlContents.Length;
}


Wenn AccessTheWebAsync keine Arbeit hat, die es zwischen dem Aufrufen von GetStringAsync und dem Rechnen des Abschlusses bewältigen kann, können Sie den Code vereinfachen, indem Sie in der folgenden Anweisung aufrufen und erwarten.

string urlContents = await client.GetStringAsync();

Die folgenden Eigenschaften fassen zusammen, was das vorherige Beispiel eine asynchrone Methode aufruft.

  • Die Methodensignatur enthält einen Async oder async-Modifizierer ein.

  • Der Name einer asynchronen Methode beendet als mit einem "asynchronen" Suffix.

  • Der Rückgabetyp ist einer der folgenden Typen:

    • Task<TResult> , wenn die - Methode eine return-Anweisung verfügt, in der der Operand Typ TResult verfügt.

    • Task , wenn die Methode keine return-Anweisung hat oder eine - Anweisung ohne Operanden hat.

    • Void Sub (in Visual Basic) Wenn Sie einen asynchronen Ereignishandler schreiben.

    Weitere Informationen finden Sie unter "Rückgabetypen und Parameter" weiter unten in diesem Thema.

  • Die - Methode umfasst normalerweise mindestens ein erwarten Ausdruck, der einen Punkt kennzeichnet, in dem die Methode nicht fortfahren kann, bis der erwartete asynchrone Vorgang abgeschlossen ist. Mittlerweile wird die - Methode und das Steuerelement kehrt zum Aufrufer der Methode angehalten. Im nächsten Abschnitt dieses Themas veranschaulicht, was am Unterbrechungspunkt geschieht.

In Async-Methoden verwenden Sie die bereitgestellten Schlüsselwörter und Typen, um die gewünschten Aktionen anzugeben. Der Compiler übernimmt den Rest, er verfolgt auch, was geschehen muss, wenn die Steuerung zu einem await-Punkt in einer angehaltenen Methode zurückkehrt. Einige Routinenprozesse, wie Schleifen und Ausnahmebehandlung, kann schwierig sein, im herkömmlichen asynchronen Code zu behandeln. In einer asynchronen Methode schreiben Sie diesen Elementen viel, wie in einer synchronen Projektmappe wurden, und das Problem gelöst wird.

Weitere Informationen zu asynchrony in früheren Versionen von .NET Framework, finden Sie unter TPL und herkömmliche asynchrone .NET-Programmierung.

Die wichtigste Aufgabe, um in der asynchronen Programmierung ist zu verstehen, wie die Ablaufsteuerung von Methode zu Methode bewegt. Das folgende Diagramm führt Sie durch den Prozess.

Asynchrones Programm verfolgen

Die Zahlen im Diagramm entsprechen den folgenden Schritten.

  1. Ein Ereignishandler ruft auf und erwartet AccessTheWebAsync asynchrone Methode.

  2. AccessTheWebAsync erstellt eine Instanz HttpClient und ruft GetStringAsync asynchrone Methode auf, um den Inhalt einer Website als Zeichenfolge herunterzuladen.

  3. Einige geschieht in GetStringAsync, dessen Status enthält. Möglicherweise muss eine Website, um herunterzuladen oder auf eine andere blockierenden Aktivität warten. So blockierenden Ressourcen, GetStringAsync Ertragsteuerelement an dessen Aufrufer vermeiden, AccessTheWebAsync.

    GetStringAsync gibt Task<TResult> zurück, in dem TResult eine Zeichenfolge ist, und AccessTheWebAsync weist die Aufgabe der getStringTask-Variable zu. Die Aufgabe stellt den laufenden Prozess für den Aufruf von GetStringAsync, mit einer Engagement dar, um einen tatsächlichen Zeichenfolgenwert zu erzeugen, wenn die Arbeit abgeschlossen wurde.

  4. Da getStringTask noch nicht erwartet wurde, kann AccessTheWebAsync mit anderer Aufgaben fortfahren, die nicht von dem Endergebnis von GetStringAsync abhängt. Dieser Vorgang wird durch einen Aufruf der synchronen Methode DoIndependentWork dargestellt.

  5. DoIndependentWork ist eine synchrone Methode, die die bereinigt und den Aufrufer zurückkehrt.

  6. AccessTheWebAsync keine Arbeit mehr zulässig, die es ohne ein Ergebnis von getStringTask bewältigen kann. AccessTheWebAsync als Nächstes möchte die Länge der Zeichenfolge heruntergeladenen berechnen und zurückgeben, aber die Methode kann diesen Wert nicht ableiten, bis die Methode die Zeichenfolge verfügt.

    Daher verwendet AccessTheWebAsync einen Erwartungsoperator, um dessen Status enthält und die - Methode zu erhalten, die AccessTheWebAsync aufgerufen wurde. AccessTheWebAsync gibt Task(Of Integer) oder Task<int> an den Aufrufer. Die Aufgabe stellt eine Zusicherung dar, ein ganzzahliges Ergebnis zu erzeugen, das die Länge der heruntergeladenen Zeichenfolge ist.

    Hinweis Hinweis

    Wenn GetStringAsync (und daher getStringTask) abgeschlossen ist, bevor AccessTheWebAsync es erwartet, bleibt Steuerelement in AccessTheWebAsync. Die Ausgabe des Anhaltens und zu AccessTheWebAsync dann zurückgeben würde wenn der aufgerufenen asynchronen Prozess (getStringTask) ist bereits abgeschlossen verschwendet und AccessTheWebSync muss nicht auf das Endergebnis warten.

    Innerhalb des Aufrufers (der Ereignishandler in diesem Beispiel), wird der Prozess wiederholt. Der Aufrufer erledigte möglicherweise andere Arbeit, die nicht vom Ergebnis von AccessTheWebAsync abhängt, bevor dieses Ergebnis erwartet, oder Aufrufer erwartet werden sofort. Wenn der Ereignishandler einen Erwartungsausdruck erreicht, die Anwendungsfokusse auf dem Abschluss von GetStringAsync. Der Ereignishandler wartet AccessTheWebAsync, und AccessTheWebAsync wartet GetStringAsync.

  7. GetStringAsync schließt ab und stellt ein Zeichenfolgenergebnis. Das Zeichenfolgenergebnis wird nicht durch den Aufruf GetStringAsync auf die Art zurückgegeben, die Sie möglicherweise erwarten. (Beachten Sie, dass die Methode bereits eine Aufgabe in Schritt 3. zurückgegeben hat), stattdessen wird das Zeichenfolgenergebnis in der Aufgabe, die den Abschluss der Methode darstellt, getStringTask gespeichert. Der Erwartungsoperator ruft das Ergebnis von getStringTask ab. Die Zuweisungsanweisung weist urlContents das abgerufene Ergebnis zu.

  8. Wenn AccessTheWebAsync das Zeichenfolgenergebnis hat, kann die Methode die Länge der Zeichenfolge berechnen. Anschließend ist die Arbeit von AccessTheWebAsync auch vollständig, und der wartenden Ereignishandler kann fortsetzen. Im vollständigen Beispiel am Ende des Themas, können Sie überprüfen, ob der Ereignishandler den Wert des Längenergebnisses abruft und gibt.

Wenn Sie der asynchronen Programmierung vertraut sind, als Sie eine Minute, um den Unterschied zwischen synchronen und asynchronen Verhalten zu berücksichtigen. Eine synchrone Methode gibt zurück, wenn die Arbeit abgeschlossen wurde (Schritt 5), aber eine asynchrone Methode gibt einen Aufgabenwert zurück, wenn die Verarbeitung angehalten wird (Schritt 3 und 6). Wenn die asynchrone Methode schließlich seine Arbeit abgeschlossen ist, wird die Aufgabe markiert, wie abgeschlossen und das Ergebnis ggf. in der Aufgabe gespeichert wird.

Weitere Informationen zur Ablaufsteuerung, finden Sie unter Ablaufsteuerung in asynchronen Programmen (C# und Visual Basic).

Sie sich möglicherweise fragen, wo Methoden wie GetStringAsync findet, die asynchrone Programmierung unterstützen. .NET Framework 4.5 enthält viele Member, die mit asynchronen Betrieb und erwarten. Sie können diese Member durch das Suffix "asynchrone" erkennen, das dem Membernamen und einem Rückgabetyp Task oder Task<TResult> angefügt wird. Beispielsweise enthält die System.IO.Stream-Klasse Methoden wie CopyToAsync, ReadAsync und WriteAsync neben den synchronen Methoden CopyTo, Read und Write.

Windows-Runtime enthält außerdem viele Methoden, die Sie mit asynchronem verwenden und in Windows Store-App erwarten können. Weitere Informationen und Beispielsmethoden finden Sie unter Schnellstart: mithilfe des Erwartungsoperators für asynchrone Programmierung unter, Asynchrone Programmierung (Windows Store-Apps) und WhenAny: Überbrückung zwischen .NET Framework und Windows-Runtime (C# und Visual Basic).

Async-Methoden sind als nicht blockierende Vorgänge gedacht.
Ein Erwartungsausdruck in einer asynchronen Methode blockiert nicht den aktuellen Thread, während die erwartete Aufgabe ausgeführt wird. Stattdessen meldet sich der Ausdruck den Rest der Methode als Fortsetzung und des Rückgabesteuerelements zum Aufrufer der asynchronen Methode an.

Das asynchrone und erwarten Schlüsselwörter verursachen nicht Hilfsthreads erstellt werden. Asynchrone Methoden ist kein Multithreading, da eine asynchrone Methode nicht in einem eigenen Thread ausgeführt wird. Die - Methode wird auf den aktuellen Synchronisierungskontext und die Verwendungszeit auf dem Thread nur ausgeführt, wenn die Methode aktiv ist. Sie können Task.Run zu Verschiebung CPU-gebundener Arbeit zu einem Hintergrundthread verwenden, aber ein Hintergrundthread wird nicht bei einem Prozess, der derzeit die wartenden Ergebnisse ist, zum verfügbar wird.

Der auf "async" basierende Ansatz der asynchronen Programmierung ist vorhandenen Ansätzen in nahezu jedem Fall vorzuziehen. Insbesondere ist dieser Ansatz besser als BackgroundWorker für EA-gebundene Vorgänge, da der Code einfacher ist und Sie nicht für Racebedingungen schützen müssen. In Kombination mit Task.Run asynchrone Programmierung ist besser als BackgroundWorker für CPU-gebundene Vorgänge, da die asynchrone Programmierung Koordinationsdetails der Ausführung des Codes der Arbeit trennt, die Task.Run an den Threadpool überträgt.

Wenn Sie angeben, dass eine Methode eine asynchrone Methode ist, indem ein Asynchrone oder asynchron-Modifizierer verwendet, können Sie die folgenden zwei Funktionen.

  • Die markierte asynchrone Methode kann Rechnen Sie oder Sie erwarten verwenden, um Unterbrechungspunkte festzulegen. Der Erwartungsoperator informiert den Compiler, dass die asynchrone Methode Vergangenheit kann nicht fortgesetzt werden kann, das zeigen erwartete, bis der asynchrone Prozess abgeschlossen ist. Mittlerweile kehrt die Steuerung an den Aufrufer der asynchronen Methode zurück.

    Die Unterbrechung einer asynchronen Methode an einem Erwartungsausdruck setzt keine Beendigung von der - Methode fest, und finally Blöcke werden nicht ausgeführt.

  • Die markierte asynchrone Methode kann auch durch Methoden erwartet werden, die sie aufrufen.

Eine asynchrone Methode enthält in der Regel eine oder mehrere Vorkommen eines Erwartungsoperators, aber die Abwesenheit von erwarten Ausdrücke führt keinen Compilerfehler. Wenn eine asynchrone Methode keinen Erwartungsoperator verwendet, um einen Unterbrechungspunkt zu markieren, führt die - Methode, wie eine synchrone Methode führt, ungeachtet des asynchronen Modifizierers aus. Der Compiler gibt eine Warnung für solche Methoden aus.

Async , async, Await und await sind kontextbedingte Schlüsselwörter. Weitere Informationen und Beispiele finden Sie unter folgenden Themen:

In der .NET Framework, gibt eine asynchrone Methode in der Regel Task oder Task<TResult> zurück. Innerhalb einer asynchronen Methode wird ein Erwartungsoperator zu einer Aufgabe angewendet, die in einem Aufruf einer anderen asynchronen Methode zurückgegeben wird.

Sie geben Task<TResult> als Rückgabetyp an, wenn die - Methode eine - Anweisung Return (Visual Basic) oder Rückgabe (C#) enthält, die einen Operanden vom Typ TResult angibt.

Sie verwenden Task als Rückgabetyp, wenn die Methode keine return-Anweisung hat oder eine return-Anweisung verfügt, die keinen Operanden zurückgibt.

Im folgenden Beispiel wird gezeigt, wie eine Methode deklarieren und aufrufen, die Task<TResult> oder Task zurückgibt.

// Signature specifies Task<TResult>
async Task<int> TaskOfTResult_MethodAsync()
{
    int hours;
    // . . .
    // Return statement specifies an integer result.
    return hours;
}

// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();


// Signature specifies Task
async Task Task_MethodAsync()
{
    // . . .
    // The method has no return statement.  
}

// Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync();
await returnedTask;
// or, in a single statement
await Task_MethodAsync();

Jede zurückgegebene Aufgabe stellt derzeit ausgeführte Arbeit dar. Eine Aufgabe kapselt Informationen über den Zustand des asynchronen Prozesses und schließlich entweder das Endergebnis vom Prozess oder die Ausnahme dass die Prozesserhöhungen, wenn sie nicht folgt.

Eine asynchrone Methode kann eine Sub-Methode (Visual Basic) auch sein oder einen void Rückgabetyp (C#). Dieser Rückgabetyp wird hauptsächlich verwendet, um Ereignishandler zu definieren, in denen ein void Rückgabetyp erforderlich ist. Asynchrone Ereignishandler dienen häufig als Ausgangspunkt für asynchrone Programme.

Eine asynchrone Methode, die eine Sub Prozedur ist, oder, die hat, ein void Rückgabetyp nicht erwartet werden kann und der Aufrufer einer void-zurückkehrenden Methode können keine Ausnahmen abfangen, die die - Methode auslöst.

Eine asynchrone Methode kann als ByRef-Parameter-Parameter in Visual Basic oder in Referenz oder Auschecken-Parameter in C# nicht deklarieren, aber die Methode kann Methoden aufrufen, die solche Parameter haben.

Weitere Informationen und Beispiele finden Sie unter Asynchrone Rückgabetypen (C# und Visual Basic). Weitere Informationen darüber, wie Ausnahmen in asynchronen Methoden, finden Sie unter try-catch (C#-Referenz) oder Try...Catch...Finally-Anweisung (Visual Basic) abfängt.

Asynchrones APIs, bei der Programmierung Windows-Runtime hat einen der folgenden Rückgabetypen, die Aufgaben ähneln:

Weitere Informationen und ein Beispiel finden Sie unter Schnellstart: mithilfe des Erwartungsoperators für asynchrone Programmierung.

Üblicherweise fügen Sie "asynchrones" in den Namen von Methoden, die einen Async oder async-Modifizierer haben.

Sie können die Konvention ignorieren, in der ein Ereignis, eine Basisklasse oder ein Schnittstellenvertrag einen anderen Namen vorsieht. Beispielsweise sollten Sie häufige Ereignishandler, wie Button1_Click nicht umbenennen.

Titel

Beschreibung

Beispiel

Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic)

Zeigt, wie eine synchrone WPF-Projektmappe für eine asynchrone WPF-Projektmappe konvertiert. Die Anwendung lädt eine Reihe von Websites herunter.

Asynchrones Beispiel: Auf die Internet-exemplarische Vorgehensweise zugreifen (C# und Visual Basic)

Gewusst wie: Erweitern der exemplarischen Vorgehensweise mit Task.WhenAll (C# und Visual Basic)

Fügt Task.WhenAll der vorherigen exemplarischen Vorgehensweise hinzu. Die Verwendung von WhenAll beginnt alle Downloads gleichzeitig.

Gewusst wie: Paralleles Erstellen mehrerer Webanforderungen (C# und Visual Basic)

Veranschaulicht, wie mehrere Aufgaben gleichzeitig beginnt.

Asynchrones Beispiel: Bereitstellen mehrerer Webanforderungen parallel (C# und Visual Basic)

Asynchrone Rückgabetypen (C# und Visual Basic)

Veranschaulicht die Typen, die asynchrone Methoden zurückgeben können und erklärt, wenn jeder Typ geeignet ist.

Ablaufsteuerung in asynchronen Programmen (C# und Visual Basic)

Ablaufverfolgungen ausführlich die Ablaufsteuerung durch eine Reihenfolge von erwarten Ausdrücke in einem asynchronen Programm.

Asynchrones Beispiel: Ablaufsteuerung in asynchrone Programme (C# und Visual Basic)

Feinabstimmung der Async-Anwendung (C# und Visual Basic)

Zeigt, wie die folgenden Funktionen der asynchronen Projektmappe hinzugefügt wird:

Asynchrones Beispiel: Ihre Anwendung genauer (C# und Visual Basic)

Ablauf des erneuten Eintretens in asynchronen Anwendungen (C# und Visual Basic)

Zeigt, wie Fälle behandelt, in denen ein aktiver asynchroner Vorgang neu gestartet wird, während er ausgeführt wird.

WhenAny: Überbrückung zwischen .NET Framework und Windows-Runtime (C# und Visual Basic)

Zeigt, wie zwischen Aufgabe Typen in .NET Framework und das IAsyncOperations in Windows-Runtime überbrückt, damit Sie WhenAny mit einer Windows-Runtime-Methode verwenden können.

Asynchrones Beispiel: Überbrückung zwischen zwischen und Windows .NET Runtime (AsTask und WhenAny)

Abbruch: Überbrückung zwischen .NET Framework und Windows-Runtime (C# und Visual Basic)

Zeigt, wie zwischen Aufgabe Typen in .NET Framework und das IAsyncOperations in Windows-Runtime überbrückt, damit Sie CancellationTokenSource mit einer Windows-Runtime-Methode verwenden können.

Asynchrones Beispiel: Überbrückung zwischen zwischen und Windows .NET Runtime (AsTask & Abbruch).

Verwenden von Async für Dateizugriff (C# und Visual Basic)

Listen und zeigt die Vorteile der Anwendung asynchron und erwartet, dass auf Dateien zugreifen.

Exemplarische Vorgehensweise: Verwenden des Debuggers mit Async-Methoden

Veranschaulicht die Ablaufsteuerung an einer Erwartungsanweisung und veranschaulicht das Verhalten Einzelschritt, des Prozedurschritt und der Ausführen bis Rücksprung Befehle in der asynchronen Methoden.

Aufgabenbasiertes asynchrones Muster (TAP, Task-based Asynchronous Pattern)

Beschreibt ein neues Muster für asynchrony in .NET Framework. Das Muster basiert auf der Task und Task<TResult>-Typen.

Schnellstart: Aufrufen von asynchrones APIs in C# oder in Visual Basic

Zeigt, wie asynchrone verwendet und in einer Windows Store-App erwartet.

Asynchrone Programmierung (Windows Store-Apps)

Übersicht über asynchrones Programmieren in Windows-Runtime bereit.

Asynchrone Videos auf Channel 9

Enthält Links zu einer Vielzahl von Videos über asynchrone Programmierung bereit.

Der folgende Code stellt die MainWindow.xaml.vb- oder "MainWindow.xaml.cs" von der WPF-Anwendung (Windows Presentation Foundation), die in diesem Thema erläutert. Sie können das Beispiel für Asynchrones Beispiel: Beispiel "von der asynchronen Programmierung mit asynchronem und erwarten" herunterladen.


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;

namespace AsyncFirstExample
{
    public partial class MainWindow : Window
    {
        // Mark the event handler with async so you can use await in it.
        private async void StartButton_Click(object sender, RoutedEventArgs e)
        {
            // Call and await separately.
            //Task<int> getLengthTask = AccessTheWebAsync();
            //// You can do independent work here.
            //int contentLength = await getLengthTask;

            int contentLength = await AccessTheWebAsync();

            resultsTextBox.Text +=
                String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
        }


        // Three things to note in the signature:
        //  - The method has an async modifier. 
        //  - The return type is Task or Task<T>. (See "Return Types" section.)
        //    Here, it is Task<int> because the return statement returns an integer.
        //  - The method name ends in "Async."
        async Task<int> AccessTheWebAsync()
        { 
            // You need to add a reference to System.Net.Http to declare client.
            HttpClient client = new HttpClient();

            // GetStringAsync returns a Task<string>. That means that when you await the
            // task you'll get a string (urlContents).
            Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");

            // You can do work here that doesn't rely on the string from GetStringAsync.
            DoIndependentWork();

            // The await operator suspends AccessTheWebAsync.
            //  - AccessTheWebAsync can't continue until getStringTask is complete.
            //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
            //  - Control resumes here when getStringTask is complete. 
            //  - The await operator then retrieves the string result from getStringTask.
            string urlContents = await getStringTask;

            // The return statement specifies an integer result.
            // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
            return urlContents.Length;
        }


        void DoIndependentWork()
        {
            resultsTextBox.Text += "Working . . . . . . .\r\n";
        }
    }
}

// Sample Output:

// Working . . . . . . .

// Length of the downloaded string: 41564.


Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft