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

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

Visual Studio 2012 содержит упрощенный подход, то программирования, который используется асинхронная поддержка в .NET Framework 4.5 и Среда выполнения Windows.Компилятор выполняет сложно работы, разработчик используется задачу и приложение сохраняет логическая структура, которая напоминает синхронного кода.Поэтому необходимо проверять все преимущества асинхронного программирования на части усилием.

В этом разделе содержатся следующие подразделы.

  • Async повышает время отклика
  • Методы Async легче записи
  • Что происходит в методе Async
  • Методы Async API
  • Потоки
  • Async и ожидает
  • Возвращаемые типы и параметры
  • Соглашение об именовании
  • Связанные разделы
  • Полный пример
  • Связанные разделы

В этом разделе представлен обзор случаи и способы использования токен CLR и ссылки для поддержки разделы, содержащие сведения и примеры.

Async повышает время отклика

Asynchrony необходимые для действий, которые потенциально блокируются, например, когда приложение получает доступ к приложению.Доступ к ресурсу Интернета иногда медленной или задержан.Если такая работа заблокирована внутри синхронного процесса, все приложение должно ожидать.В асинхронном процесс, приложение может продолжить другой операцией, не будет зависеть от ресурсе Интернета, потенциально блокирующих задача завершается.

В следующей таблице показаны наиболее области, где асинхронное программирование повышает время отклика.Перечисленные API из .NET Framework 4.5 и Среда выполнения Windows содержат методы, поддерживающие программирование токена.

Области приложения

Поддержка интерфейсов API, которые содержат методы токенов

Доступ Интернета

HttpClient, SyndicationClient

Работа с файлами

StorageFileStreamWriter, StreamReader, XmlReader

Работа с образами

MediaCapture, BitmapEncoderBitmapDecoder

Программирование WCF

Синхронный и асинхронной операции

Работа с сокетами

Socket

Asynchrony вызывает особенно ценное для приложений с доступом к потоку пользовательского интерфейса, поскольку все Пользовательский интерфейс- связанной работа обычно имеет один поток.Если любой процесс блокируется в синхронном приложение, все блокировки.Приложение перестает отвечать, и его можно заключить, что происходит, когда вместо просто ожидает.

При использовании асинхронных методов, приложение продолжает работу с пользовательским интерфейсом.Можно изменить размер или свернуть окно, например, либо закрыть приложение, если не нужно дождаться его завершения.

Подход к Async-, добавляет эквивалент автоматической передачи в список параметров, можно выбрать при разработке асинхронных операций.Таким образом, пользователь получает все преимущества стандартных асинхронный программировать, но с очень меньше усилий со стороны разработчика.

Методы Async легче записи

Ключевые слова Async и Рекомендуется в Visual Basic и ключевого слова токен и рекомендуется в C-# является основой программирования токена.С помощью этих 2 слов, ресурсы можно использовать в платформе .NET Framework или Среда выполнения Windows для создания асинхронный метод почти так же легко, как создается синхронный метод.Асинхронные методы, которые определяются с помощью токена и ожидаемые называются методы токена.

В следующем примере показан метод токена.Почти все в коде должно выглядеть полностью знакомым вам.Комментарии, вызывающие функции, добавляемые для создания asynchrony.

Можно найти файл полный пример в конце этого раздела, и можно загрузить пример из Пример Async. Пример из "асинхронного программирования с Async и ожидает".

' Three things to note in the signature:
'  - The method has an Async modifier. 
'  - The return type is Task or Task(Of T). (See "Return Types" section.)
'    Here, it is Task(Of Integer) because the return statement returns an integer.
'  - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)

    ' You need to add a reference to System.Net.Http to declare client.
    Dim client As HttpClient = New HttpClient()

    ' GetStringAsync returns a Task(Of String). That means that when you await the
    ' task you'll get a string (urlContents).
    Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


    ' You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork()

    ' The Await operator suspends AccessTheWebAsync.
    '  - AccessTheWebAsync can't continue until getStringTask is complete.
    '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
    '  - Control resumes here when getStringTask is complete. 
    '  - The Await operator then retrieves the string result from getStringTask.
    Dim urlContents As String = Await getStringTask

    ' The return statement specifies an integer result.
    ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    Return urlContents.Length
End Function
// Three things to note in the signature:
//  - The method has an async modifier. 
//  - The return type is Task or Task<T>. (See "Return Types" section.)
//    Here, it is Task<int> because the return statement returns an integer.
//  - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{ 
    // You need to add a reference to System.Net.Http to declare client.
    HttpClient client = new HttpClient();

    // GetStringAsync returns a Task<string>. That means that when you await the
    // task you'll get a string (urlContents).
    Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

    // You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork();

    // The await operator suspends AccessTheWebAsync.
    //  - AccessTheWebAsync can't continue until getStringTask is complete.
    //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
    //  - Control resumes here when getStringTask is complete. 
    //  - The await operator then retrieves the string result from getStringTask.
    string urlContents = await getStringTask;

    // The return statement specifies an integer result.
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    return urlContents.Length;
}

Если AccessTheWebAsync не имеет никакой работы, который открывает между вызовом GetStringAsync и используйте его завершения, можно упростить код путем вызова и обратно в следующей одну инструкцию.

Dim urlContents As String = Await client.GetStringAsync()
string urlContents = await client.GetStringAsync();

Следующие характеристики объединяют, что делает в предыдущем примере метод токена.

  • Сигнатура метода включает модификатор Async или async.

  • Имя метода токена, как правило, для выполнения с помощью суффикса Async.

  • Возвращаемый тип одного из следующих типов:

    • значение Task<TResult>, если этот метод имеет возвращаемое выражение, в котором операнд типа TResult.

    • если метод Task не имеет возвращаемого выражение или имеет возвращаемое выражение без операнда.

    • Void ( Sub в Visual Basic), если необходимо написать обработчик событий токена.

    Дополнительные сведения см. в разделе "типы возвращаемых значений и параметров" далее в этом разделе.

  • Метод обычно содержит по крайней мере одно ожидает выражения (которое отмечает точку, в которой метод не может продолжаться до тех пор, пока ожидается асинхронная операция не будет завершена.В то же время, метод приостановлен, и элемент управления возвращается вызывающему объекту метода.В следующем подразделе этого раздела показано, что происходит в точку подвеса.

В методах токена, следует использовать предоставленные ключевые слова и типы, чтобы указать, что требуется задачи, и компилятор делает все остальное, включая следить за тем, что произойдет, когда элемент управления возвращается в точке ожидать в приостановленном методе.Некоторые регулярная процессы, таких как циклы и обработка исключений, трудно обрабатывать в асинхронном традиционном коде.В асинхронном методе эти элементы пишутся почти так же, как это делается в синхронном решении, и проблема решается.

Дополнительные сведения о asynchrony в предыдущих версиях платформы .NET Framework см. в разделе Библиотека параллельных задач и традиционное асинхронное программирование .NET.

Что происходит в методе Async

Наиболее важной прежде всего, необходимо понимать в асинхронном программировании, как поток управления перемещается из метода в метод.Следующая схема содержит необходимо выполнить процесс.

Трассировка асинхронной программы

Числа в схеме соответствуют следующим шагам.

  1. Обработчик событий вызывает метод AccessTheWebAsync и ожидает токена.

  2. AccessTheWebAsync создается экземпляр HttpClient и вызывается асинхронным методом GetStringAsync, чтобы загрузить содержимое веб-сайта в виде строки.

  3. Что-либо происходит в GetStringAsync, приостанавливает ход выполнения.Возможно, придется ждать веб-сайт, чтобы загрузить или какая-либо другая действие блокировки.Чтобы избежать блокировать ресурсы, GetStringAsync создает элемент управления, в вызывающий объект, AccessTheWebAsync.

    GetStringAsync возвращает Task<TResult>, где TResult строку и присвоить AccessTheWebAsync для переменной getStringTask.Задача представляет собой выполняющихся процесс для вызова GetStringAsync, с обязательством создавать фактическое значение работа завершена.

  4. Поскольку getStringTask не является AccessTheWebAsync, пока ожидается может продолжить другой операцией, не зависит от конечного результата от GetStringAsync.Этот рабочий представляется синхронному вызовом метода DoIndependentWork.

  5. синхронный метод DoIndependentWork, который выполняет свою работу и возвращает его в вызывающий объект.

  6. AccessTheWebAsync выполняет из действий, открывает без результата от getStringTask.далее нужно вычислить AccessTheWebAsync и возвращает длину загруженной строки, но метод не может вычислить это значение до тех пор, пока метод не будет содержать строку.

    Таким образом, AccessTheWebAsync использует оператор ожидать приостановки ход выполнения и создание элемента управления методу, который вызвал метод AccessTheWebAsync.AccessTheWebAsync возвращает значение Task(Of Integer) или Task<int> в вызывающий объект.Задача представляет объявления является " обещанием " для целого числа, длина загруженной строки.

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

    Если GetStringAsync ( getStringTask) и поэтому завершены, прежде чем AccessTheWebAsync ожидает его, элемент управления в AccessTheWebAsync.Может быть расточительствована затраты приостановки и затем возвращает значение AccessTheWebAsync, если вызывается асинхронный процесс (getStringTask) уже завершила и AccessTheWebSync не должно ожидать конечный результат.

    Внутри обработчика событий вызывающего объекта (в данном примере), процесс повторен.Вызывающий объект может выполнять другую работу, не зависит от результатов из AccessTheWebAsync, перед ожидать результата, а вызывающий объект может ожидать немедленно.Если обработчик событий выражение будет ожидать, приложение обращается внимание при завершении GetStringAsync.Обработчик событий ожидает AccessTheWebAsync, AccessTheWebAsync и GetStringAsync.

  7. GetStringAsync завершается, и предоставляет строки.Результат строки не возвращаются при вызове GetStringAsync способом, можно ожидать, что.(Помните, что метод уже является задачи на шаге 3). вместо этого результат строки хранятся в задачу, которая представляет завершения метода: getStringTask.Оператор ожидать извлекает результат из getStringTask.Оператор присваивания извлеченный результат присвоить значение urlContents.

  8. Если AccessTheWebAsync содержит результат строки, метод может вычислить длину строки.Затем рабочий AccessTheWebAsync также завершил работу, и обработчик событий может ожидать возобновления.В полном примере в конце раздела, можно проверить, обработчик событий извлекает значение длины и вывод результатов.

Для новичков в асинхронному программированию требуют минуты необходимо учитывать различия между синхронным и асинхронным расширением функциональности.Синхронный метод возвращает при его по окончании (раздел 5), но метод возвращают значение токена для своей работой при обратном (шаги 3 и 6).Когда метод токена в конечном счете завершает работу, задача помечается как фактический и результат, если таковые имеются, хранятся в задаче.

Дополнительные сведения о потоке управления см. в разделе Поток управления в асинхронных программах (C# и Visual Basic).

Методы Async API

, Могут возникнуть сомнения, где найти такие методы, как GetStringAsync, поддерживающие программирование токена..NET Framework 4.5 содержит множество элементов, которые работают с async и await.Можно определить эти элементы суффиксом "Async", который вложен в имя элемента и возвращаемый тип Task или Task<TResult>.Например, класс System.IO.Stream содержит методы, такие как CopyToAsync, ReadAsync и WriteAsync наряду с синхронными методами CopyTo, Read и Write.

Среда выполнения Windows также содержит множество методов, которые можно использовать с токеном и ожидает в приложениях Магазина Windows.Дополнительные сведения и примеры методов см. в Учебник. с помощью оператора ожидание асинхронного программирования разделе, Асинхронное программирование приложений магазином (Windows) и WhenAny. Связывание .NET Framework и среды выполнения Windows (C# и Visual Basic).

Потоки

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

Токен и ожидает слов не вызывает дополнительные потоки не созданные.Асинхронные методы не требуют многопоточности, поскольку асинхронный метод не выполняется в своем собственном потоке.Он выполняется в текущем контексте синхронизации и использует время в потоке, только когда метод активен.Task.Run можно использовать для перемещения ограниченный возможностями процессора работу в фоновому потоку, но фоновый поток не помогает с процессом, просто ожидает результаты станет доступным.

Подход к Async- зависимости к асинхронному программированию предпочтителен в существующие подходам практически все случаи.В частности, этот подход является более эффективным, чем BackgroundWorker для IO- привязанных операций, поскольку код более прост и не нужно защититься от состояния гонки.В сочетании с Task.Run, программирование токена лучше, чем BackgroundWorker для операций с ограниченными возможностями процессора, поскольку программирование токена отделяет сведения координации выполнять код из действий, Task.Run перемещает к threadpool.

Async и ожидает

Если определяется, что метод токена, используя модификатор Async или токен, следует включить следующие 2 возможности.

  • Отметки токена может использовать метод Рекомендуется или рекомендуется для обозначения точки подвеса.Оператор ожидать сообщает компилятору, что метод токена не может быть продолжен после, которое указывает, пока ожидается асинхронный процесс не завершится.В то же время, элемент управления возвращается в вызывающий объект метода токена.

    Приостановка метода токена в выражении ожидать не составляет выход из метода и блоки finally не выполняются.

  • Отметки сам метод токена может быть способен методами, которые вызывают его.

Метод токена обычно содержит один или несколько вхождений оператора прослушивание, но не ожидает выражений не вызывает ошибку компилятора.Если метод токена не используется оператор требуется, чтобы отметить точку подвеса, метод выполняется как синхронный метод выполняет, несмотря на модификатор токена.При компиляции таких методов выдается предупреждение.

Async, async, Await и await — контекстные ключевые слова.Дополнительные сведения и примеры см. в следующих разделах:

Возвращаемые типы и параметры

В программировании платформы .NET Framework, обычно токена метод возвращает Task или Task<TResult>.Внутри метода токена, используйте оператор применяется к задаче, возвращаемую из вызова другому методу токена.

Укажите Task<TResult> в качестве возвращаемого типа, если метод содержит оператор Return (Visual Basic) или return (C#), который задает операнд типа TResult.

Класс Task используется в качестве возвращаемого значения, если метод не имеет возвращаемого выражение или имеет возвращаемое выражение, которое возвращает операнд.

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

' Signature specifies Task(Of Integer)
Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

    Dim hours As Integer
    ' . . .
    ' Return statement specifies an integer result.
    Return hours
End Function

' Calls to TaskOfTResult_MethodAsync
Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()


' Signature specifies Task
Async Function Task_MethodAsync() As Task

    ' . . .
    ' The method has no return statement.
End Function

' Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()
// Signature specifies Task<TResult>
async Task<int> TaskOfTResult_MethodAsync()
{
    int hours;
    // . . .
    // Return statement specifies an integer result.
    return hours;
}

// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();


// Signature specifies Task
async Task Task_MethodAsync()
{
    // . . .
    // The method has no return statement.  
}

// Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync();
await returnedTask;
// or, in a single statement
await Task_MethodAsync();

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

Метод токена может также быть методом Sub (Visual Basic) или иметь тип возвращаемого значения - void (C-#).Этот тип данных используется главным образом для определения обработчики событий, где тип возвращаемого значения - void.Обработчики событий Async часто служат в качестве отправной точки для программ токена.

Асинхронный метод, который является процедурой Sub или имеет возвращаемый тип void, нельзя ожидать, и вызывающий объект метода, возвращающего void, не может перехватывать какие-либо исключения, которые выдает этот метод.

Асинхронный метод не может объявить параметры ByRef в Visual Basic или ref или out в C#, но он может вызывать методы, которые обладают такими параметрами.

Дополнительные сведения и примеры см. в разделе Асинхронные типы возвращаемых значений (C# и Visual Basic).Дополнительные сведения о том, как перехватывать исключения в асинхронных методах см. в разделе try-catch (Справочник по C#) или Оператор Try... Catch... Finally (Visual Basic).

Асинхронные API в программировании Среда выполнения Windows имеют один из следующих возвращаемых типов, которые похожи на задачи:

Дополнительные сведения и пример см. в разделе Учебник. с помощью оператора ожидание асинхронного программирования

Соглашение об именовании

По соглашению добавлении Async к именам методов, которые имеют модификатор Async или async.

Соглашение можно игнорировать в тех случаях, когда событие, базовый класс или контракты интерфейсов предлагают другое имя.Например, не следует переименовывать общие обработчики событий, такие как Button1_Click.

Связанные разделы

Заголовок

Описание

Пример

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

Показано, как преобразовать синхронное решение WPF в асинхронный решение WPF.Приложение загрузит данные веб-сайтов.

Пример Async. Доступ к пошаговом руководстве Интернета (C-# и Visual Basic)

Практическое руководство. Расширение пошагового руководства с использованием метода Task.WhenAll (C# и Visual Basic)

Добавление Task.WhenAll к предыдущему пошаговому руководству.Использование WhenAll запускает все загрузки одновременно.

Практическое руководство. Параллельное выполнение нескольких веб-запросов (C# и Visual Basic)

Демонстрация того, как запустить несколько задач в одно и то же время.

Пример Async. Выполнить несколько запросов параллельно Интернета (C-# и Visual Basic)

Асинхронные типы возвращаемых значений (C# и Visual Basic)

Описывает типы токена, методы могут возвращать описание каждого типа и при необходимости.

Поток управления в асинхронных программах (C# и Visual Basic)

Трассировки подробно поток элемента управления с помощью последовательности ожидает асинхронной выражений в программе.

Пример Async. Поток управления в программах Async (C-# и Visual Basic)

Настройка асинхронного приложения (C# и Visual Basic)

Показано, как добавить следующие функциональные возможности к асинхронному решению:

Пример Async. Настраивающ приложение (C-# и Visual Basic)

Обработка повторного входа в асинхронных приложениях (C# и Visual Basic)

Показывает, как обрабатывать случаи, в которых активной асинхронной операции перезапуска при ее выполнении.

WhenAny. Связывание .NET Framework и среды выполнения Windows (C# и Visual Basic)

Показывает, как в мосту между типами задач в платформе .NET Framework и IAsyncOperations в Среда выполнения Windows, чтобы можно было использовать Среда выполнения Windows с помощью метода WhenAny.

Пример Async. Использование моста между .NET и среда выполнения Windows (AsTask и WhenAny)

Отмена. Связывание .NET Framework и среды выполнения Windows (C# и Visual Basic)

Показывает, как в мосту между типами задач в платформе .NET Framework и IAsyncOperations в Среда выполнения Windows, чтобы можно было использовать CancellationTokenSource с методом Среда выполнения Windows.

Пример Async. Использование моста между .NET и среда выполнения Windows (AsTask & отмену)

Использование метода Async для доступа к файлам (C# и Visual Basic)

Списки и демонстрируются преимущества использования токена и ожидает для доступа к файлам.

Пошаговое руководство. Использование отладчика с асинхронными методами

Демонстрация потока управления в операторе await и расширения функциональности команд Шаг с заходом, Шаг с обходом и Шаг с выходом в пределах асинхронных методов.

Асинхронный шаблон, основанный на задачах (TAP)

Описание нового шаблона для асинхронности в платформе .NET Framework.Шаблон основан на типах Task и Task<TResult>.

Учебник. Вызов асинхронных интерфейсов API в C-# или Visual Basic

Показывает, как использовать токен и обратно в приложении Магазина Windows.

Асинхронное программирование приложений магазином (Windows)

Общие сведения об асинхронном программировании в Среда выполнения Windows.

Видеоклипы Async по каналу 9

Ссылки на различные видеозаписи о программировании токена.

Полный пример

Следующий код в файле MainWindow.xaml.vb или MainWindow.xaml.cs из приложения Windows Presentation Foundation (WPF), в этом разделе обсуждаются.Можно загрузить пример из Пример Async. Пример из "асинхронного программирования с Async и ожидает".

' Add an Imports statement and a reference for System.Net.Http
Imports System.Net.Http

Class MainWindow

    ' Mark the event handler with async so you can use Await in it.
    Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

        ' Call and await separately.
        'Task<int> getLengthTask = AccessTheWebAsync();
        '' You can do independent work here.
        'int contentLength = await getLengthTask;

        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &=
            String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, contentLength)
    End Sub


    ' Three things to note in the signature:
    '  - The method has an Async modifier. 
    '  - The return type is Task or Task(Of T). (See "Return Types" section.)
    '    Here, it is Task(Of Integer) because the return statement returns an integer.
    '  - The method name ends in "Async."
    Async Function AccessTheWebAsync() As Task(Of Integer)

        ' You need to add a reference to System.Net.Http to declare client.
        Dim client As HttpClient = New HttpClient()

        ' GetStringAsync returns a Task(Of String). That means that when you await the
        ' task you'll get a string (urlContents).
        Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


        ' You can do work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork()

        ' The Await operator suspends AccessTheWebAsync.
        '  - AccessTheWebAsync can't continue until getStringTask is complete.
        '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
        '  - Control resumes here when getStringTask is complete. 
        '  - The Await operator then retrieves the string result from getStringTask.
        Dim urlContents As String = Await getStringTask

        ' The return statement specifies an integer result.
        ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
        Return urlContents.Length
    End Function


    Sub DoIndependentWork()
        ResultsTextBox.Text &= "Working . . . . . . ." & vbCrLf
    End Sub
End Class

' Sample Output:

' Working . . . . . . .

' Length of the downloaded string: 41763.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// Add a using directive and a reference for System.Net.Http;
using System.Net.Http;

namespace AsyncFirstExample
{
    public partial class MainWindow : Window
    {
        // Mark the event handler with async so you can use await in it.
        private async void StartButton_Click(object sender, RoutedEventArgs e)
        {
            // Call and await separately.
            //Task<int> getLengthTask = AccessTheWebAsync();
            //// You can do independent work here.
            //int contentLength = await getLengthTask;

            int contentLength = await AccessTheWebAsync();

            resultsTextBox.Text +=
                String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
        }


        // Three things to note in the signature:
        //  - The method has an async modifier. 
        //  - The return type is Task or Task<T>. (See "Return Types" section.)
        //    Here, it is Task<int> because the return statement returns an integer.
        //  - The method name ends in "Async."
        async Task<int> AccessTheWebAsync()
        { 
            // You need to add a reference to System.Net.Http to declare client.
            HttpClient client = new HttpClient();

            // GetStringAsync returns a Task<string>. That means that when you await the
            // task you'll get a string (urlContents).
            Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

            // You can do work here that doesn't rely on the string from GetStringAsync.
            DoIndependentWork();

            // The await operator suspends AccessTheWebAsync.
            //  - AccessTheWebAsync can't continue until getStringTask is complete.
            //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
            //  - Control resumes here when getStringTask is complete. 
            //  - The await operator then retrieves the string result from getStringTask.
            string urlContents = await getStringTask;

            // The return statement specifies an integer result.
            // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
            return urlContents.Length;
        }


        void DoIndependentWork()
        {
            resultsTextBox.Text += "Working . . . . . . .\r\n";
        }
    }
}

// Sample Output:

// Working . . . . . . .

// Length of the downloaded string: 41564.

См. также

Ссылки

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

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

Оператор Await (Visual Basic)

Async (Visual Basic)