Delen via


await-operator : wacht asynchroon totdat een taak is voltooid

De await operator onderbreekt de evaluatie van de asynchrone methode totdat de asynchrone bewerking die wordt vertegenwoordigd door de operand is voltooid. Wanneer de asynchrone bewerking is voltooid, retourneert de await operator het resultaat van de bewerking, indien van toepassing. Wanneer de await operator wordt toegepast op de operand die een reeds voltooide bewerking vertegenwoordigt, retourneert deze het resultaat van de bewerking onmiddellijk zonder ophanging van de insluitmethode. De await operator blokkeert de thread die de asynchrone methode evalueert niet. Wanneer de await operator de asynchrone methode onderbreekt, keert het besturingselement terug naar de aanroeper van de methode.

In het volgende voorbeeld retourneert de HttpClient.GetByteArrayAsync methode het Task<byte[]> exemplaar, dat een asynchrone bewerking vertegenwoordigt die een bytematrix produceert wanneer deze is voltooid. Totdat de bewerking is voltooid, onderbreekt de await operator de DownloadDocsMainPageAsync methode. Wanneer DownloadDocsMainPageAsync wordt onderbroken, wordt het besturingselement teruggezet naar de Main methode, de aanroeper van DownloadDocsMainPageAsync. De Main methode wordt uitgevoerd totdat het resultaat van de asynchrone bewerking moet worden uitgevoerd door de DownloadDocsMainPageAsync methode. Wanneer GetByteArrayAsync alle bytes worden ontvangen, wordt de rest van de DownloadDocsMainPageAsync methode geëvalueerd. Daarna wordt de rest van de Main methode geëvalueerd.

public class AwaitOperator
{
    public static async Task Main()
    {
        Task<int> downloading = DownloadDocsMainPageAsync();
        Console.WriteLine($"{nameof(Main)}: Launched downloading.");

        int bytesLoaded = await downloading;
        Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes.");
    }

    private static async Task<int> DownloadDocsMainPageAsync()
    {
        Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading.");

        var client = new HttpClient();
        byte[] content = await client.GetByteArrayAsync("https://learn.microsoft.com/en-us/");

        Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
        return content.Length;
    }
}
// Output similar to:
// DownloadDocsMainPageAsync: About to start downloading.
// Main: Launched downloading.
// DownloadDocsMainPageAsync: Finished downloading.
// Main: Downloaded 27700 bytes.

De operand van een await expressie moet een melding geven wanneer een taak is voltooid. Over het algemeen wordt een gemachtigde aangeroepen wanneer de taak is voltooid, hetzij geslaagd of mislukt. De await sectie van de C#-taalspecificatie bevat de details over hoe deze meldingen worden geïmplementeerd.

In het voorgaande voorbeeld wordt de asynchrone Main methode gebruikt. Zie de wachtoperator in de sectie Main-methode voor meer informatie.

Notitie

Zie Asynchrone programmering met asynchroon programmeren en wachten voor een inleiding tot asynchrone programmering. Asynchroon programmeren met async en await volgt het asynchrone patroon op basis van taken.

U kunt de await operator alleen gebruiken in een methode, lambda-expressie of anonieme methode die wordt gewijzigd door het asynchrone trefwoord. Binnen een asynchrone methode kunt u de await operator niet gebruiken in de hoofdtekst van een synchrone lokale functie, binnen het blok van een vergrendelingsinstructie en in een onveilige context.

De operand van de await operator is meestal van een van de volgende .NET-typen: Task, Task<TResult>, ValueTaskof ValueTask<TResult>. Elke te wachten expressie kan echter de operand van de await operator zijn. Zie de sectie Awaitable-expressies van de C#-taalspecificatie voor meer informatie.

Het type expressie await t is TResult als het type expressie t is Task<TResult> of ValueTask<TResult>. Als het type is of , is het type await t void.ValueTaskTask t Als er in beide gevallen t een uitzondering wordt gegenereerd, await t wordt de uitzondering opnieuw gegooid.

Asynchrone stromen en wegwerpers

U gebruikt de await foreach instructie om een asynchrone gegevensstroom te gebruiken. Zie de foreach instructiesectie van het artikel Iteratie-instructies voor meer informatie.

U gebruikt de await using instructie om te werken met een asynchroon wegwerpobject, dat wil zeggen een object van een type dat een IAsyncDisposable interface implementeert. Zie de sectie Using async disposable van het artikel Een DisposeAsync-methode implementeren voor meer informatie.

await-operator in de Main-methode

De Main methode, het invoerpunt van de toepassing, kan worden geretourneerd Task of Task<int>, zodat deze asynchroon kan zijn, zodat u de operator in de await hoofdtekst ervan kunt gebruiken. In eerdere C#-versies, om ervoor te zorgen dat de Main methode wacht op het voltooien van een asynchrone bewerking, kunt u de waarde ophalen van de eigenschap van het Task<TResult>.Result Task<TResult> exemplaar dat wordt geretourneerd door de bijbehorende asynchrone methode. Voor asynchrone bewerkingen die geen waarde produceren, kunt u de Task.Wait methode aanroepen. Zie C#-taalversiebeheer voor informatie over het selecteren van de taalversie.

C#-taalspecificatie

Zie de sectie Await-expressies van de C#-taalspecificatie voor meer informatie.

Zie ook