async (C#-Referenz)
Der async-Modifizierer gibt an, dass die - Methode, Lambda-Ausdruck oder anonyme Methode, das es ändert, asynchron ist.Solche Methoden wird als asynchrone Methoden.
Eine asynchrone Methode bietet eine einfache Möglichkeit, möglicherweise Aufgaben ausführt mit langer Laufzeit, ohne den Thread des Aufrufers zu blockieren.Der Aufrufer einer asynchronen Methode kann seine Arbeit fortsetzen, ohne auf die asynchrone Methode zu warten, bis zu beenden.
Hinweis |
---|
Die async und await Schlüsselwörter wurden in Visual Studio 2012 eingeführt.Informationen zu anderen neue Funktionen in dieser Version, finden Sie unter Neues in Visual Studio 2012. Eine Einführung in die asynchrone Programmierung, finden Sie unter Asynchrone Programmierung mit Async und Await (C# und Visual Basic). |
Im folgenden Beispiel wird die Struktur eines asynchronen Ereignishandlers, StartButton_Click, der eine asynchrone Methode aufruft, ExampleMethodAsync an.Das Ergebnis von der - Methode ist die Länge einer heruntergeladenen Website.Der Code ist für eine Anwendung für WPF (Windows Presentation Foundation) oder des Windows Stores geeignet.
// In desktop apps that you create by using Visual Studio 2012, you must
// add a reference and a using directive for System.Net.Http.
// In Windows Store apps, you must add using directives for System.Net.Http
// and System.Threading.Tasks.
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
// ExampleMethodAsync returns a Task<int> and has an int result.
// A value is assigned to intTask when ExampleMethodAsync reaches
// an await.
try
{
Task<int> intTask = ExampleMethodAsync();
// You can do other work here that doesn't require the result from
// ExampleMethodAsync. . . .
// You can access the int result when ExampleMethodAsync completes.
int intResult = await intTask;
// Or you can combine the previous two steps:
//int intResult = await ExampleMethodAsync();
// Process the result (intResult). . . .
}
catch (Exception)
{
// Process the exception. . . .
}
}
public async Task<int> ExampleMethodAsync()
{
var httpClient = new HttpClient();
// At the await expression, execution in this method is suspended, and
// control returns to the caller of ExampleMethodAsync.
// Variable exampleInt is assigned a value when GetStringAsync completes.
int exampleInt = (await httpClient.GetStringAsync("https://msdn.microsoft.com")).Length;
// You can break the previous line into several steps to clarify what happens:
//Task<string> contentsTask = httpClient.GetStringAsync("https://msdn.microsoft.com");
//string contents = await contentsTask;
//int exampleInt = contents.Length;
// Continue with whatever processing is waiting for exampleInt. . . .
// After the return statement, any method that's awaiting
// ExampleMethodAsync can get the integer result.
return exampleInt;
}
Wichtig |
---|
Ein vollständiges WPF-Beispiel, das ähnliche Elemente verwendet, finden Sie unter Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic).Sie können den Code der exemplarischen Vorgehensweise von Entwickler-Codebeispiele herunterladen. |
In der Regel enthält eine Methode, die vom async-Schlüsselwort geändert wird, mindestens einen Sie erwarten Ausdruck oder -Anweisung.Die - Methode wird synchron ausgeführt, bis er den ersten Ausdruck await erreicht, an dem Punkt diese gehalten wird, bis die erwartete Aufgabe abgeschlossen ist.Mittlerweile wird Steuerelement zum Aufrufer der - Methode zurückgegeben.Wenn die Methode keinen await Ausdruck oder - Anweisung enthält, wird sie synchron aus.Eine Compilerwarnung werden Sie auf alle asynchronen Methoden, die nicht await enthalten, da diese Situation möglicherweise ein Fehler angegeben hat.Weitere Informationen finden Sie unter Compilerwarnung (Stufe 1) CS4014.
Das async-Schlüsselwort ist ein Kontextschlüsselwort.Es ist ein Schlüsselwort, wenn es eine Möglichkeit, einen Lambda-Ausdruck oder eine anonyme Methode ändert.In allen anderen Kontexten wird er als Bezeichner interpretiert.
Rückgabetypen
Eine asynchrone Methode kann einen Rückgabetyp Task, Task<TResult> oder void haben.Die - Methode kann keine Referenz oder Auschecken-Parameter deklarieren, obwohl sie Methoden aufrufen können, die solche Parameter haben.
Sie geben Task<TResult> als Rückgabetyp einer asynchronen Methode an, wenn die Rückgabe-Anweisung der Methode einen Operanden vom Typ TResult angibt.Sie verwenden Task, wenn kein sinnvoller Wert zurückgegeben wird, wenn die Methode abgeschlossen ist.Das bedeutet, dass ein Aufruf der - Methode Task zurück, aber, wenn Task abgeschlossen ist, wertet jeder await Ausdruck, der Task erwartet, aus, um aufzuheben.
Der void Rückgabetyp wird hauptsächlich verwendet, um Ereignishandler zu definieren, in denen ein void Rückgabetyp erforderlich ist.Der Aufrufer void-zurückkehrenden einer asynchronen Methode kann sie nicht erwarten und kann Ausnahmen auffangen, die die - Methode auslöst.
Weitere Informationen und Beispiele finden Sie unter Asynchrone Rückgabetypen (C# und Visual Basic).
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic)
Referenz
Konzepte
Asynchrone Programmierung mit Async und Await (C# und Visual Basic)