Краткое объяснение Async / Await в .Net 4.5

Как работают асинхронные задачи (Async / Await) в .Net 4.5?

Некоторые примеры кода:

private async Task TestFunction() { var x = await DoesSomethingExists(); var y = await DoesSomethingElseExists(); return y; } 

Выполняется ли второй await сразу или после первого await возвращается?

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

Для получения дополнительной информации см. Введение в async / await или официальное FAQ .

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

Представьте, что это будет выглядеть так:

 var x = await GetSomeObjectInstance(); var y = await GetSomeObjectInstance2(x); 

Вероятно, где-то возникнет исключение NullReferenceException, поэтому первое ожидание должно вернуться первым. В противном случае x будет иметь значение null / undefined или что-то еще.

Вызов методов будет по-прежнему происходить последовательно, как «обычные», не ожидаемые вызовы методов. objectiveю ожидания является то, что он вернет текущий stream в пул streamов, в то время как ожидаемая операция завершается и что-то делает.

Это особенно полезно в средах высокой производительности, например, на веб-сервере, где данный запрос обрабатывается в данном streamе из общего пула streamов. Если мы этого не ожидаем, то данный stream, обрабатывающий запрос (и все его ресурсы), остается «в использовании», а вызов db / service завершается. Это может занять несколько секунд или более, особенно для внешних вызовов службы.

Теперь на сайтах с низким трафиком это не большая проблема, но на сайтах с высоким трафиком стоимость всех этих streamов запросов просто сидит, ничего не делая, в состоянии «в использовании», ожидая других процессов, таких как вызовы db / service возrotation может быть ресурсным бременем.

Нам лучше отпустить stream обратно в рабочий пул, чтобы он мог выполнять другую полезную работу для другого запроса.

Как только вызов db / service завершается, мы можем прервать пул streamов и попросить stream продолжить обработку этого запроса с того места, где он остановился. В этот момент состояние запроса перезагружается и вызов метода продолжается.

Таким образом, на основе запроса при использовании ждут, запрос будет по-прежнему занимать одинаковое количество времени с точки зрения пользователей … плюс крошечный smidge больше для накладных расходов на переключение.

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

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

  • Как реализовать ConcurrentHashSet в .Net
  • Эта строка уже относится к другой ошибке таблицы при попытке добавить строки?
  • Как использовать Microsoft.Office.Interop.Excel на компьютере без установленного MS Office?
  • Уменьшение использования памяти приложений .NET?
  • Алгоритмы заполнения паводков
  • C ++ 11: я могу перейти от нескольких аргументов к кортежу, но могу ли я перейти от кортежа к нескольким аргументам?
  • Привязка модели к списку MVC 4
  • «Ошибка тайм-аута семафора истек» для подключения USB
  • Способ равномерного сдвига буферизованных событий
  • Вычисление pow (a, b) mod n
  • Как десериализовать объект JSON с недопустимым именем поля в нем
  • Interesting Posts

    bootstrap-typeahead.js добавляет слушателя на событие select

    Анализ данных JSON с помощью C #

    AppFresh-подобное программное обеспечение для Windows?

    Соединение остается помеченным как ESTABLISHED, даже если хост не подключен

    JavaFX передает значения от дочернего к родительскому

    Внедрение преобразователей для объектов с Java Generics

    Как удалить пунктирную границу вокруг активных гиперссылок в IE8 с помощью CSS

    Скрытие ActionBar в RecyclerView / ListView onScroll

    Удалить все вхождения символа из строки

    Как регулярные выражения работают в htaccess для перенаправления диапазона IP

    Каков ваш любимый подход к совместному использованию cookie для перекрестных доменов?

    MongoDB GridFs с C #, как хранить файлы, такие как изображения?

    Как получить сводную статистику по группам

    Приложение Java EE Enterprise: выполните некоторые действия по развертыванию / запуску

    Что такое оператор Java?: И что он делает?

    Давайте будем гением компьютера.