await — operatorC# (odwołanie)await operator (C# reference)

Operator await wstrzymuje Obliczanie otaczającej metody asynchronicznej do momentu zakończenia operacji asynchronicznej reprezentowanej przez operand.The await operator suspends evaluation of the enclosing async method until the asynchronous operation represented by its operand completes. Po zakończeniu operacji asynchronicznej operator await zwraca wynik operacji (jeśli istnieje).When the asynchronous operation completes, the await operator returns the result of the operation, if any. Gdy operator await jest stosowany do operandu, który reprezentuje już wykonaną operację, zwraca wynik operacji natychmiast bez zawieszania otaczającej metody.When the await operator is applied to the operand that represents already completed operation, it returns the result of the operation immediately without suspension of the enclosing method. Operator await nie blokuje wątku, który szacuje metodę asynchroniczną.The await operator doesn't block the thread that evaluates the async method. Gdy operator await zawiesza otaczającą metodę asynchroniczną, formant powraca do obiektu wywołującego metody.When the await operator suspends the enclosing async method, the control returns to the caller of the method.

W poniższym przykładzie metoda HttpClient.GetByteArrayAsync zwraca wystąpienie Task<byte[]>, które reprezentuje operację asynchroniczną, która generuje tablicę bajtową po jej zakończeniu.In the following example, the HttpClient.GetByteArrayAsync method returns the Task<byte[]> instance, which represents an asynchronous operation that produces a byte array when it completes. Do momentu ukończenia operacji, operator await zawiesza metodę DownloadDocsMainPageAsync.Until the operation completes, the await operator suspends the DownloadDocsMainPageAsync method. Gdy DownloadDocsMainPageAsync jest wstrzymana, formant jest zwracany do metody Main, która jest obiektem wywołującym DownloadDocsMainPageAsync.When DownloadDocsMainPageAsync gets suspended, control is returned to the Main method, which is the caller of DownloadDocsMainPageAsync. Metoda Main jest wykonywana do momentu, gdy nie będzie potrzebowała wyniku operacji asynchronicznej wykonywanej przez metodę DownloadDocsMainPageAsync.The Main method executes until it needs the result of the asynchronous operation performed by the DownloadDocsMainPageAsync method. Gdy GetByteArrayAsync pobiera wszystkie bajty, zostanie oceniona pozostała część metody DownloadDocsMainPageAsync.When GetByteArrayAsync gets all the bytes, the rest of the DownloadDocsMainPageAsync method is evaluated. Następnie zostanie oceniona pozostała część metody Main.After that, the rest of the Main method is evaluated.

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.

Poprzedni przykład używa metody Main asynchronicznej, która jest możliwa od C# 7,1.The preceding example uses the async Main method, which is possible beginning with C# 7.1. Aby uzyskać więcej informacji, zobacz operator await w sekcji metody Main .For more information, see the await operator in the Main method section.

Uwaga

Aby zapoznać się z wprowadzeniem do programowania asynchronicznego, zobacz programowanie asynchroniczne z Async i await.For an introduction to asynchronous programming, see Asynchronous programming with async and await. Programowanie asynchroniczne przy użyciu async i await następuje po wzorcu asynchronicznym opartym na zadaniach.Asynchronous programming with async and await follows the task-based asynchronous pattern.

Operatora await można używać tylko w metodzie, wyrażeniu lambdalub metodzie anonimowej , która jest modyfikowana przez słowo kluczowe Async .You can use the await operator only in a method, lambda expression, or anonymous method that is modified by the async keyword. W metodzie asynchronicznej nie można użyć operatora await w treści funkcji synchronicznej, wewnątrz bloku instrukcji locki w niebezpiecznym kontekście.Within an async method, you cannot use the await operator in the body of a synchronous function, inside the block of a lock statement, and in an unsafe context.

Operand operatora await ma zazwyczaj jeden z następujących typów .NET: Task, Task<TResult>, ValueTasklub ValueTask<TResult>.The operand of the await operator is usually of one of the following .NET types: Task, Task<TResult>, ValueTask, or ValueTask<TResult>. Jednak każde oczekiwane wyrażenie może być argumentem operacji operatora await.However, any awaitable expression can be the operand of the await operator. Aby uzyskać więcej informacji, zobacz sekcję oczekiwane wyrażenia w C# specyfikacji języka.For more information, see the Awaitable expressions section of the C# language specification.

Typ wyrażenia await t jest TResult, jeśli typem wyrażenia t jest Task<TResult> lub ValueTask<TResult>.The type of expression await t is TResult if the type of expression t is Task<TResult> or ValueTask<TResult>. Jeśli typ t jest Task lub ValueTask, typ await t jest void.If the type of t is Task or ValueTask, the type of await t is void. W obu przypadkach, jeśli t zgłasza wyjątek, await t ponownie generuje wyjątek.In both cases, if t throws an exception, await t rethrows the exception. Aby uzyskać więcej informacji na temat obsługi wyjątków, zobacz sekcję wyjątki w metodach asynchronicznych artykułu instrukcji try-catch .For more information about exception handling, see the Exceptions in async methods section of the try-catch statement article.

Słowa kluczowe async i await są dostępne w C# 5 i nowszych wersjach.The async and await keywords are available in C# 5 and later.

operator await w metodzie Mainawait operator in the Main method

Począwszy od C# 7,1, MetodaMain, która jest punktem wejścia aplikacji, może zwracaćTasklubTask<int>, umożliwiając jej asynchroniczne, aby można było użyć operatoraawaitw swojej treści.Beginning with C# 7.1, the Main method, which is the application entry point, can return Task or Task<int>, enabling it to be async so you can use the await operator in its body. W starszych C# wersjach, aby upewnić się, że metodaMainczeka na ukończenie operacji asynchronicznej, możesz pobrać wartość właściwościTask<TResult>.ResultwystąpieniaTask<TResult>, która jest zwracana przez odpowiadającą metodę asynchroniczną.In earlier C# versions, to ensure that the Main method waits for the completion of an asynchronous operation, you can retrieve the value of the Task<TResult>.Result property of the Task<TResult> instance that is returned by the corresponding async method. W przypadku operacji asynchronicznych, które nie generują wartości, można wywołać metodę Task.Wait.For asynchronous operations that don't produce a value, you can call the Task.Wait method. Aby uzyskać informacje o sposobach wybierania wersji językowej, zobacz C# przechowywanie wersji języka.For information about how to select the language version, see C# language versioning.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz sekcję await Expressions C# specyfikacji języka.For more information, see the Await expressions section of the C# language specification.

Zobacz takżeSee also