Freigeben über


await (C#-Referenz)

Der await-Operator wird mit einer Aufgabe in einer asynchronen Methode, die Ausführung der - Methode aufzunehmen angewendet, bis die erwartete Aufgabe ausführt.Die Aufgabe wird derzeit ausgeführte Arbeit dar.

Die asynchrone Methode, in der await verwendet wird, muss vom asynchron-Schlüsselwort geändert werden.Eine solche Methode, definiert, indem der async-Modifizierer verwendet, und gewöhnlich eine oder mehrere await Ausdrücke enthält, wird als eine asynchrone Methode.

HinweisHinweis

Die async und await Schlüsselwörter wurden in Visual Studio 2012 eingeführt.Weitere Informationen zu neuen 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).

Die Aufgabe, zu der der await-Operator in der Regel angewendet wird, ist der Rückgabewert in einem Aufruf einer Methode, die implementiert Aufgabenbasiertes asynchrone Muster.Beispielseinschließungswerte des Typs Task oder Task<TResult>.

Im folgenden Code werden die HttpClient-Methode GetByteArrayAsyncTask<byte[]>, getContentsTask zurück.Die Aufgabe ist eine Zusicherung, das tatsächliche Bytearray zu erzeugen, wenn die Aufgabe abgeschlossen wurde.Der await-Operator wird auf getContentsTask angewendet, um die Ausführung in SumPageSizesAsync angehalten, bis getContentsTask abgeschlossen ist.Mittlerweile wird Steuerelement zum Aufrufer von SumPageSizesAsync zurückgegeben.Wenn getContentsTask beendet ist, wertet der await Ausdruck in ein Bytearray aus.

private async Task SumPageSizesAsync()
{
    // To use the HttpClient type in desktop apps, you must include a using directive and add a 
    // reference for the System.Net.Http namespace.
    HttpClient client = new HttpClient();
    // . . .
    Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
    byte[] urlContents = await getContentsTask;

    // Equivalently, now that you see how it works, you can write the same thing in a single line.
    //byte[] urlContents = await client.GetByteArrayAsync(url);
    // . . .
}
Wichtiger HinweisWichtig

Das vollständige Beispiel finden Sie unter Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic).Sie können das Beispiel Entwickler-Codebeispiele auf der Microsoft-Website herunterladen.Das Beispiel ist im AsyncWalkthrough_HttpClient-Projekt.

Wie im vorherigen Beispiel wenn await zum Ergebnis eines Methodenaufrufs angewendet wird, der Task<TResult> zurückgibt, ist der Typ des await Ausdrucks TResult.Wenn await zum Ergebnis eines Methodenaufrufs angewendet wird, der Task zurückgibt, ist der Typ des await Ausdruckstyp ungültig.Das folgende Beispiel veranschaulicht den Unterschied.

// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();

// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();

Ein await Ausdruck blockiert nicht den Thread, in dem er ausgeführt wird.Stattdessen wird er den Compiler, den Rest der asynchronen Methode Anmeldung wie eine Fortsetzung auf der erwarteten Aufgabe.Steuerelement kehrt dann an den Aufrufer der asynchronen Methode zurück.Wenn die Aufgabe abgeschlossen hat, ruft sie die Fortsetzung und Ausführung der asynchronen Methodenzusammenfassungen, in denen sie weg abgebrochen wurde.

Ein await Ausdruck kann nur im Text einer sofort einschließenden Methode, eines Lambda-Ausdrucks oder einer anonymen Methode auftreten, die durch einen async-Modifizierer gekennzeichnet ist.Der Begriff erwarten dient als Schlüsselwort nur in diesem Kontext.Anderswo wird er als Bezeichner interpretiert.In der - Methode, des Lambda-Ausdrucks oder der anonymen Methode kann ein await Ausdruck nicht im Text einer synchronen Funktion, in einem Abfrageausdruck, im catch oder finally-Block von Ausnahmebehandlungsanweisung, im - Block von lock-Anweisung oder in einem unsicher Kontext auftreten.

Ausnahmen

Die meisten asynchronen Methoden geben Task oder Task<TResult> zurück.Die Eigenschaften der zurückgegebenen Aufgabe enthalten Informationen über den Status und Verlauf, wie, ob die Aufgabe abgeschlossen ist, ob die asynchrone Methode eine Ausnahme verursachen könnte oder abgebrochen wurde, und welches Ergebnis ist.Der Operator await greift auf diese Eigenschaften zu.

Wenn Sie eine Aufgabe-zurückkehrende asynchrone Methode erwarten, die eine Ausnahme verursacht, löst der Operator await die Ausnahme erneut aus.

Wenn Sie eine Aufgabe-zurückkehrende asynchrone Methode erwarten, die abgebrochen wird, löst der Operator awaitOperationCanceledException erneut aus.

Eine einzelne Aufgabe, die in einem "Faulted" Zustand befindet, kann mehrere Ausnahmen entsprechen.Beispielsweise könnte die Aufgabe das Ergebnis eines Aufrufs zu Task.WhenAll.Wenn Sie eine solche Aufgabe erwarten, löst der Erwartungsvorgang nur eine Ausnahmen erneut aus.Sie können jedoch nicht vorhersagen, welches der Ausnahmen erneut ausgelöst wird.

Beispiele für die Fehlerbehandlung in asynchronen Methoden, finden Sie unter try-catch (C#-Referenz).

Beispiel

Im folgenden Windows Forms veranschaulicht die Verwendung von await in einer asynchronen Methode, WaitAsynchronouslyAsync.Vergleichen Sie das Verhalten dieser Methode mit dem Verhalten von WaitSynchronously.Ohne einen await-Operator, der einer Aufgabe angewendet wird, wird WaitSynchronously synchron trotz der Verwendung von dem async-Modifizierer in ihrer Definition und in einem Aufruf von Thread.Sleep in seinem Text ausgeführt.

private async void button1_Click(object sender, EventArgs e)
{
    // Call the method that runs asynchronously.
    string result = await WaitAsynchronouslyAsync();

    // Call the method that runs synchronously.
    //string result = await WaitSynchronously ();

    // Display the result.
    textBox1.Text += result;
}

// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window 
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
    await Task.Delay(10000);
    return "Finished";
}

// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
    // Add a using directive for System.Threading.
    Thread.Sleep(10000);
    return "Finished";
}

Siehe auch

Aufgaben

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

Referenz

async (C#-Referenz)

Konzepte

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