operátor await – asynchronně čeká na dokončení úlohy.

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

V následujícím příkladu HttpClient.GetByteArrayAsync metoda vrátí Task<byte[]> instanci, která představuje asynchronní operaci, která po dokončení vytvoří pole bajtů. Dokud operace není dokončena, await operátor pozastaví metodu DownloadDocsMainPageAsync . Při DownloadDocsMainPageAsync pozastavení se ovládací prvek vrátí metodě Main , která je volajícím metody DownloadDocsMainPageAsync. Metoda se Main spustí, dokud nepotřebuje výsledek asynchronní operace prováděné metodou DownloadDocsMainPageAsync . Když GetByteArrayAsync načte všechny bajty, vyhodnotí se DownloadDocsMainPageAsync zbytek metody. Potom se vyhodnotí zbytek Main 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í metoduMain. Další informace najdete v části Metoda Main o operátoru await .

Poznámka

Úvod do asynchronního programování najdete v tématu Asynchronní programování s asynchronním programováním a funkcí await. Asynchronní programování s asynchronním vzorem asynczaloženým na úlohách a await dodržuje ho.

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

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

Typ výrazu await t jeTResult, pokud je Task<TResult> typ výrazu t nebo ValueTask<TResult>. Pokud je TaskValueTasktyp t nebo , typ await t je void. V obou případech, pokud t 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 .

Asynchronní streamy a jednorázové datové proudy

Pomocí await foreach příkazu můžete využívat asynchronní datový proud. Další informace najdete v foreach části příkazu článku Iterační příkazy .

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

Operátor await v metodě Main

MetodaMain, která je vstupním bodem aplikace, může vrátit Task nebo Task<int>, což umožňuje, aby byla asynchronní, takže můžete v jejím těle použít await operátor . Chcete-li zajistit, aby Main metoda čekala na dokončení asynchronní operace, můžete v dřívějších verzích jazyka C# načíst hodnotu Task<TResult>.Result vlastnosti Task<TResult> instance, která je vrácena odpovídající asynchronní metodou. Pro asynchronní operace, které nevytvářely hodnotu, můžete volat metodu Task.Wait . Informace o tom, jak vybrat verzi jazyka, najdete v tématu Správa verzí jazyka C#.

specifikace jazyka C#

Další informace najdete v části Výrazy Awaitspecifikace jazyka C#.

Viz také