Sdílet prostřednictvím


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

Operátor await pozastaví vyhodnocení ohraničující asynchronní metody, dokud se asynchronní operace reprezentovaná jeho operandem nedokončí. Po dokončení await asynchronní operace vrátí operátor výsledek operace, pokud existuje. await Pokud 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í uzavřenou asynchronní metodu, ovládací prvek se vrátí volající metodě.

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 nebude dokončena, await operátor pozastaví metodu DownloadDocsMainPageAsync . Když DownloadDocsMainPageAsync se pozastaví, ovládací prvek se vrátí do Main metody, což je volající .DownloadDocsMainPageAsync Metoda Main se provede, dokud nebude potřebovat výsledek asynchronní operace prováděné metodou DownloadDocsMainPageAsync . Když GetByteArrayAsync získá všechny bajty, zbytek DownloadDocsMainPageAsync metody se vyhodnotí. Potom se vyhodnotí zbytek Main metody.

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.

Operand výrazu await musí poskytovat oznámení po dokončení úkolu. Obecně platí, že delegát je vyvolán při dokončení úkolu, a to buď úspěšně, nebo neúspěšně. Část await specifikace jazyka C# obsahuje podrobnosti o způsobu implementace těchto oznámení.

Předchozí příklad používá asynchronní metodu.Main Další informace naleznete v operátoru await v části Main metoda .

Poznámka:

Úvod do asynchronního programování naleznete v tématu Asynchronní programování s asynchronní a await. Asynchronní programování s asynchronním vzorem založeným async 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 asynchronním klíčovým slovem. V rámci asynchronní metody nemůžete použít await operátor v těle synchronní místní funkce, uvnitř bloku příkazu lock a v nebezpečném kontextu.

Operand operátoru await je obvykle jedním z následujících typů .NET: Task, Task<TResult>, ValueTask, nebo ValueTask<TResult>. Libovolný výraz awaitable však může být operand operátoru await . Další informace najdete v části 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 typ t nebo ValueTask, typ await t je void.Task V obou případech, pokud t vyvolá výjimku, await t znovu zvětšte výjimku.

Asynchronní datové proudy a jednorázové

Tento příkaz použijete await foreach k využívání asynchronního datového proudu. Další informace najdete v foreach části příkazu článku o příkazech iterace.

Příkaz slouží await using k práci s asynchronně uvolnitelným objektem, tj. objektem typu, který implementuje IAsyncDisposable rozhraní. Další informace najdete v části Použití asynchronního použití v č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>povolit, aby byla asynchronní, takže můžete použít await operátor v jeho těle. V dřívějších verzích jazyka C# zajistěte, aby Main metoda čekala na dokončení asynchronní operace, můžete načíst hodnotu Task<TResult>.Result vlastnosti Task<TResult> instance, která je vrácena odpovídající asynchronní metodou. U asynchronních operací, které negenerují hodnotu, můžete metodu Task.Wait volat. Informace o tom, jak vybrat jazykovou verzi, najdete v tématu Správa verzí jazyka C#.

specifikace jazyka C#

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

Viz také