await (Справочник по C#)

Оператор await применяется к задаче в асинхронном метод приостанавливает выполнение метода до тех пор, пока ожидается задача не будет завершено.Задача представляет собой выполняющихся работы.

Асинхронный метод await, в котором используется должен быть изменен ключевым словом токен.Такой метод, указанный с помощью модификатора async и обычно содержать один или несколько выражений await, называется Метод async.

ПримечаниеПримечание

Ключевые слова async и await были введены в Visual Studio 2012.Дополнительные сведения о новых функциях в этой версии см. в разделе Новые возможности Visual Studio 2012, версия-кандидат.

Введение в токен программировании см. в разделе Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic).

Задача, к которой применяется оператор await обычно возвращаемое значение из вызова метода, реализующего Асинхронная модель на основе задач.Примеры включают значения типа Task или Task<TResult>.

В следующем коде GetByteArrayAsync, метод HttpClient возвращает значение Task<byte[]>, getContentsTask.Для объявления является " обещанием " создать фактический массив байтов, когда задача завершена.Оператор await применяется к getContentsTask приостанавливает выполнение в SumPageSizesAsync, пока getContentsTask не будет завершено.В то же время, элемент управления возвращается вызывающему объекту SumPageSizesAsync.После завершения метода getContentsTask, выражение await является в массив байтов.

private async Task SumPageSizesAsync()
{
    // To use the HttpClient type in desktop apps, you must include a using directive and add a 
    // reference for the System.Net.Http namespace.
    HttpClient client = new HttpClient();
    // . . .
    Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
    byte[] urlContents = await getContentsTask;

    // Equivalently, now that you see how it works, you can write the same thing in a single line.
    //byte[] urlContents = await client.GetByteArrayAsync(url);
    // . . .
}
Важное примечаниеВажно

Полный пример см. в разделе Пошаговое руководство. Получение доступа к Интернету с помощью модификатора Async и оператора Await (C# и Visual Basic).Пример, Примеры кода разработчика можно загрузить с веб-сайта корпорации Майкрософт.Пример в проекте AsyncWalkthrough_HttpClient.

Как показано в предыдущем примере, если await применяется к результату вызова метода, который возвращает Task<TResult>, то тип выражения await TResult.Если атрибут await применяется к результату вызова метода, который возвращает Task, то тип выражения await пуст.В следующем примере показана разница.

// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();

// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();

Выражение await не блокирует поток, в котором он выполняется.Вместо этого он заставляет компилятор зарегистрироваться остальную часть метода токена как продолжение, предназначенную для задачи.Затем элемент управления возвращает вызывающему объекту метода токена.Если задача завершается, она вызывает его продолжение, а выполнение метода токена продолжится, где он вышло.

Выражение await может произойти только в теле немедленно внешнего метода, лямбда-выражения, или анонимного метода, помеченный модификатором async.Термин ожидает служит ключевое слово только в этом контексте.В другом месте, она обрабатывается как идентификатор.В методе, лямбда-выражения, или анонимного метода, выражение await не может содержаться в теле функции синхронной, в выражении запроса, в блоке catch или finallyвыписка обработки исключений, в блоке выписка блокировки, либо в контексте небезопасный.

Исключения

Большинство методов токена возвращают значение Task или Task<TResult>.Свойства возвращаемой задачи содержат сведения об ее состоянии и журнал, например ли задача завершена, приводит ли метод токена исключение или был отменен, и что конечный результат.Оператор await можно получить эти свойства.

Если предполагается, что задачи и возвратя метода, токена, который вызывает исключение, повторно создает исключение оператора await.

Если предполагается, что задачи и возвратя метода, токена, отменяется, повторно создает оператора awaitOperationCanceledException.

Одна задача, в состоянии, ошибли может являться несколько исключений.Например, задача может быть результатом вызова Task.WhenAll.После получения такой задачи, повторно создает только один операции ожидать исключений.Однако нельзя предугадать, какой из исключений, повторно создаются.

Примеры обработки ошибок в методах токенов см. в разделе try-catch (Справочник по C#).

Пример

В следующем примере показано использование Windows Forms await токена, в методе WaitAsynchronouslyAsync.Сравнение расширение функциональности этого метода с расширением функциональности WaitSynchronously.Без оператора await, примененный к задаче, даже если WaitSynchronously выполняется одновременно использовать модификатор async в определении и вызове Thread.Sleep в своем теле.

private async void button1_Click(object sender, EventArgs e)
{
    // Call the method that runs asynchronously.
    string result = await WaitAsynchronouslyAsync();

    // Call the method that runs synchronously.
    //string result = await WaitSynchronously ();

    // Display the result.
    textBox1.Text += result;
}

// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window 
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
    await Task.Delay(10000);
    return "Finished";
}

// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
    // Add a using directive for System.Threading.
    Thread.Sleep(10000);
    return "Finished";
}

См. также

Задачи

Пошаговое руководство. Получение доступа к Интернету с помощью модификатора Async и оператора Await (C# и Visual Basic)

Ссылки

async (справочник по C#)

Основные понятия

Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic)