await operátor – aszinkron módon vár egy feladat befejezésére

Az await operátor felfüggeszti a beágyazási aszinkron metódus kiértékelését, amíg az operandus által képviselt aszinkron művelet be nem fejeződik. Ha az aszinkron művelet befejeződik, az await operátor visszaadja a művelet eredményét, ha van ilyen. Ha az operátor egy await már befejezett műveletet jelképező operandusra van alkalmazva, a művelet eredményét azonnal, a beágyazási módszer felfüggesztése nélkül adja vissza. Az await operátor nem blokkolja az aszinkron metódust kiértékelő szálat. Amikor az await operátor felfüggeszti a beágyazási aszinkron metódust, a vezérlő visszatér a metódus hívójának.

A következő példában a HttpClient.GetByteArrayAsync metódus a Task<byte[]> példányt adja vissza, amely egy aszinkron műveletet jelöl, amely a befejezett bájttömböt hozza létre. A művelet befejezéséig az await operátor felfüggeszti a metódust DownloadDocsMainPageAsync . Amikor DownloadDocsMainPageAsync a rendszer felfüggeszti, a rendszer visszaadja a vezérlést a Main metódusnak, amely a hívója DownloadDocsMainPageAsync. A Main metódus addig fut, amíg a metódus által DownloadDocsMainPageAsync végrehajtott aszinkron művelet eredményére nem lesz szüksége. Amikor GetByteArrayAsync lekéri az összes bájtot, a metódus többi része DownloadDocsMainPageAsync kiértékelésre kerül. Ezt követően a metódus többi része Main kiértékelésre kerül.

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.

A kifejezés operandusának await értesítést kell adnia egy feladat befejezésekor. A feladat befejezésekor általában egy meghatalmazottat hív meg a függvény, akár sikeresen, akár sikertelenül. A await C# nyelvi specifikációjának szakasza részletesen ismerteti az értesítések implementálásának módját.

Az előző példa az aszinkron Main metódust használja. További információkért tekintse meg a Főmetódus szakaszban található várakozási operátort.

Feljegyzés

Az aszinkron programozás bemutatása: Aszinkron programozás aszinkronnal és várakozással. Aszinkron programozás a feladatalapú aszinkron mintávalasync és await azt követi.

Az operátort csak az aszinkron await kulcsszó által módosított metódusban, lambdakifejezésben vagy névtelen metódusban használhatja. Az aszinkron metóduson belül nem használhatja az await operátort a szinkron függvény törzsében, a zárolási utasítás blokkjában és nem biztonságos környezetben.

Az operátor operandusa await általában a következő .NET-típusok egyike: Task, Task<TResult>, ValueTaskvagy ValueTask<TResult>. A várt kifejezés azonban az operátor operandusa await lehet. További információ: A C# nyelv specifikációjának Várandó kifejezések szakasza.

A kifejezés await t típusa az, TResult ha a kifejezés tTask<TResult> típusa vagy ValueTask<TResult>. Ha a típus t vagy TaskValueTaskaz , akkor a típus await t a következő void. Mindkét esetben, ha t kivételt ad ki, await t a kivételt újból meg kell ismételni.

Aszinkron streamek és eldobható

Az utasítással await foreach aszinkron adatstreamet használhat. További információkért tekintse meg az foreach Iteration utasításokkal foglalkozó cikk utasítás szakaszát.

Az await using utasítással egy aszinkron módon eldobható objektummal, vagyis egy interfészt implementáló IAsyncDisposable típusú objektummal dolgozhat. További információ: Az DisposeAsync metódus implementálása című cikk Aszinkron aszinkron használata című szakasza.

várakozási operátor a Main metódusban

A Main metódus, amely az alkalmazás belépési pontja, visszaadható Task , vagy Task<int>lehetővé teszi aszinkron módon, hogy az operátort a await törzsében használhassa. A korábbi C#-verziókban annak érdekében, hogy a Main metódus megvárja az aszinkron művelet befejezését, lekérheti annak a példánynak az Task<TResult>.ResultTask<TResult> értékét, amelyet a megfelelő aszinkron metódus ad vissza. Olyan aszinkron műveletek esetén, amelyek nem hoznak létre értéket, meghívhatja a metódust Task.Wait . A nyelvi verzió kiválasztásáról további információt a C# nyelvi verziószámozásában talál.

C# nyelvspecifikáció

További információ: A C# nyelv specifikációjának Kifejezések várva című szakasza.

Lásd még