await – operátor (Referenční příručka jazyka C#)

Operátor pozastaví vyhodnocení nadřazené asynchronní metody, dokud se nedokoní asynchronní operace await reprezentované jejím operandem. Po dokončení asynchronní operace vrátí operátor výsledek operace, pokud await je k nějakému. Pokud je operátor použit na operand, který představuje již dokončenou operaci, vrátí výsledek operace okamžitě bez pozastavení await nadřazené metody. Operátor await neblokuje vlákno, které vyhodnocuje asynchronní metodu. Když operátor await pozastaví ohraničující asynchronní metodu, ovládací prvek se vrátí volajícímu metody.

V následujícím příkladu metoda vrátí instanci , která představuje asynchronní operaci, která po dokončení vytvoří pole HttpClient.GetByteArrayAsync Task<byte[]> bajtů. Dokud se operace nedokoní, await operátor metodu DownloadDocsMainPageAsync pozastaví. Když DownloadDocsMainPageAsync dojde k pozastavení, ovládací prvek se vrátí do Main metody , což je volající DownloadDocsMainPageAsync . Metoda Main se spustí, dokud nebude potřebovat výsledek asynchronní operace prováděné DownloadDocsMainPageAsync metodou . Když GetByteArrayAsync získá všechny bajty, vyhodnotí se DownloadDocsMainPageAsync zbytek metody. Potom se vyhodnotí Main zbytek metody.

using System;
using System.Net.Http;
using System.Threading.Tasks;

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://docs.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.

Předchozí příklad používá asynchronní metodu , Main kteráje možná od jazyka C# 7.1. Další informace najdete v operátoru await v části metody Main.

Poznámka

Úvod do asynchronního programování najdete v tématu Asynchronní programování s modifikátorem asynca operátorem await . Asynchronní programování s async a await se řídí asynchronním vzorem založeným na úkolech.

Operátor můžete použít await pouze v metodě, výrazu lambdanebo anonymní metodě upravené klíčovým slovem async. V rámci asynchronní metody nelze použít operátor v těle synchronní funkce, uvnitř bloku příkazu lock a v await nezabezpečeném kontextu.

Operand operátoru je obvykle jedním z následujících await typů rozhraní .NET: Task , , nebo Task<TResult> ValueTask ValueTask<TResult> . Libovolný výraz awaitable však může být operandem await operátoru. Další informace najdete v části Awaitable expressions specifikace jazyka C#.

Typ výrazu await t je , pokud je typ TResult t výrazu nebo Task<TResult> ValueTask<TResult> . Pokud je t typ Task nebo , je ValueTask typ await t void . V obou případech, t pokud vyvolá výjimku, await t znovu vyvolá výjimku. Další informace o zpracování výjimek najdete v části Výjimky v asynchronních metodách článku o příkazu try-catch.

Klíčová async slova a jsou k dispozici v await jazyce C# 5 a novějším.

Asynchronní streamy a na jedno použití

Počínaje jazykem C# 8.0 můžete pracovat s asynchronními datovými proudy a na jedno použití.

Pomocí příkazu await foreach můžete využívat asynchronní datový proud. Další informace najdete v části s příkazy foreach v článku Iterační příkazy a v části Asynchronní datové proudy článku Co je nového v jazyce C# 8.0.

Příkaz slouží await using k práci s asynchronně jednorázovým objektem, to znamená objektem typu, který implementuje IAsyncDisposable rozhraní. Další informace najdete v části Použití asynchronního uvolnění v článku Implementace metody DisposeAsync.

Operátor await v metodě Main

Počínaje jazykem C# 7.1 může metoda Main ,což je vstupní bod aplikace, vrátit nebo , což umožňuje, aby byla asynchronní, takže můžete použít operátor v jeho Task Task<int> await těle. V dřívějších verzích jazyka C# můžete pro zajištění, že metoda čeká na dokončení asynchronní operace, načíst hodnotu vlastnosti instance, která je vrácena odpovídající asynchronní Main Task<TResult>.Result Task<TResult> metodou. Pro asynchronní operace, které nevytvářenou hodnotu, můžete volat Task.Wait metodu . Informace o tom, jak vybrat verzi jazyka, najdete v tématu o verzích jazyka C#.

specifikace jazyka C#

Další informace najdete v části Await expressions specifikace jazyka C#.

Viz také