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.
- Asynchrone Reaktionsgeschwindigkeit verbessert
- Asynchrone Methoden sind einfacher zu schreiben
- Was in einer asynchronen Methode geschieht
- Asynchrone Methoden API
- Threads
- Asynchrone und erwarten Sie
- Rückgabetypen und Parameter
- Namenskonvention
- Verwandte Themen
- Vollständiges Beispiel
- Verwandte Themen
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.
Asynchrone Reaktionsgeschwindigkeit verbessert
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 an, wo 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 |
|
Arbeiten mit Dateien |
|
Arbeiten mit Bildern |
|
WCF-Programmierung |
|
Arbeiten mit Sockets |
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, alle werden blockiert blockiert.die Anwendung beendet reagieren und Sie stellen möglicherweise fest, dass sie fehlgeschlagen ist, wenn stattdessen sie gerade 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.
Asynchrone Methoden sind einfacher zu schreiben
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.
Sie können die vollständige Beispieldatei am Ende dieses Themas suchen, und Sie können das Beispiel für Asynchrones Beispiel: Beispiel "von der asynchronen Programmierung mit asynchronem und erwarten" herunterladen.
' Three things to note in the signature:
' - The method has an Async modifier.
' - The return type is Task or Task(Of T). (See "Return Types" section.)
' Here, it is Task(Of Integer) because the return statement returns an integer.
' - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)
' You need to add a reference to System.Net.Http to declare client.
Dim client As HttpClient = New HttpClient()
' GetStringAsync returns a Task(Of String). That means that when you await the
' task you'll get a string (urlContents).
Dim getStringTask As Task(Of String) = client.GetStringAsync("https://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.
Dim urlContents As String = Await getStringTask
' The return statement specifies an integer result.
' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
Return urlContents.Length
End Function
// 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("https://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.
Dim urlContents As String = Await client.GetStringAsync()
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 den asynchronen Methoden verwenden Sie die bereitgestellten Schlüsselwörter und Typen, um anzugeben, was Sie tun möchten, und der Compiler hat den Rest, einschließlich beim Verfolgen, was geschehen muss, wenn das Steuerelement kehrt zu einem Erwartung in einer angehaltenen Methode zeigen.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.
Was in einer asynchronen Methode geschieht
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.
Die Zahlen im Diagramm entsprechen den folgenden Schritten.
Ein Ereignishandler ruft auf und erwartet AccessTheWebAsync asynchrone Methode.
AccessTheWebAsync erstellt eine Instanz HttpClient und ruft GetStringAsync asynchrone Methode auf, um den Inhalt einer Website als Zeichenfolge herunterzuladen.
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.
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.
DoIndependentWork ist eine synchrone Methode, die die bereinigt und den Aufrufer zurückkehrt.
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 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.
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.
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).
Asynchrone Methoden API
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).
Threads
Asynchrone Methoden werden dazu, die nicht blockierende Vorgänge zu sein.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 asynchron-basierte Ansatz für asynchrone Programmierung ist zu vorhandenen Ansätzen in fast 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.
Asynchrone und erwarten Sie
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:
Rückgabetypen und Parameter
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(Of Integer)
Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)
Dim hours As Integer
' . . .
' Return statement specifies an integer result.
Return hours
End Function
' Calls to TaskOfTResult_MethodAsync
Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()
' Signature specifies Task
Async Function Task_MethodAsync() As Task
' . . .
' The method has no return statement.
End Function
' Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()
// 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:
IAsyncOperation, das zu Task<TResult> entspricht
IAsyncAction, das zu Task entspricht
Weitere Informationen und ein Beispiel finden Sie unter Schnellstart: mithilfe des Erwartungsoperators für asynchrone Programmierung.
Namenskonvention
Ü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.
Verwandte Themen
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) |
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) |
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). |
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. |
|
Übersicht über asynchrones Programmieren in Windows-Runtime bereit. |
||
Enthält Links zu einer Vielzahl von Videos über asynchrone Programmierung bereit. |
Vollständiges Beispiel
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.
' Add an Imports statement and a reference for System.Net.Http
Imports System.Net.Http
Class MainWindow
' Mark the event handler with async so you can use Await in it.
Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
' Call and await separately.
'Task<int> getLengthTask = AccessTheWebAsync();
'' You can do independent work here.
'int contentLength = await getLengthTask;
Dim contentLength As Integer = Await AccessTheWebAsync()
ResultsTextBox.Text &=
String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, contentLength)
End Sub
' Three things to note in the signature:
' - The method has an Async modifier.
' - The return type is Task or Task(Of T). (See "Return Types" section.)
' Here, it is Task(Of Integer) because the return statement returns an integer.
' - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)
' You need to add a reference to System.Net.Http to declare client.
Dim client As HttpClient = New HttpClient()
' GetStringAsync returns a Task(Of String). That means that when you await the
' task you'll get a string (urlContents).
Dim getStringTask As Task(Of String) = client.GetStringAsync("https://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.
Dim urlContents As String = Await getStringTask
' The return statement specifies an integer result.
' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
Return urlContents.Length
End Function
Sub DoIndependentWork()
ResultsTextBox.Text &= "Working . . . . . . ." & vbCrLf
End Sub
End Class
' Sample Output:
' Working . . . . . . .
' Length of the downloaded string: 41763.
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("https://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.