Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Фон [ править ]

AMI является шаблоном проектирования для асинхронного вызова потенциально продолжительных методов в качестве объекта . [1] Это эквивалентно схеме долговых расписок («Я должен тебе»), описанной в 1996 году Алланом Вермёленом. [2] [3]

В большинстве языков программирования вызываемый метод выполняется синхронно, то есть в потоке выполнения.из которого он вызывается. Если для завершения метода требуется много времени, например, потому что он загружает данные через Интернет, вызывающий поток блокируется до тех пор, пока метод не завершится. Когда это нежелательно, можно запустить «рабочий поток» и вызвать метод оттуда. В большинстве сред программирования для этого требуется много строк кода, особенно если позаботиться о том, чтобы избежать накладных расходов, которые могут быть вызваны созданием большого количества потоков. AMI решает эту проблему за счет того, что он дополняет потенциально длительно работающий («синхронный») метод объекта «асинхронным» вариантом, который возвращается немедленно, вместе с дополнительными методами, которые упрощают получение уведомления о завершении или ожидание завершения в более позднее время.

Одним из распространенных способов использования AMI является шаблон проектирования активных объектов . Альтернативой является вызов синхронного метода и будущие объекты . [4] Примером приложения, которое может использовать AMI, является веб-браузер, которому необходимо отображать веб-страницу даже до загрузки всех изображений.

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

Реализации [ править ]

Класс Java [ править ]

Класс FutureTask [5] в Java использует события для решения той же проблемы. Этот шаблон является вариантом AMI, реализация которого несет больше накладных расходов, но полезна для объектов, представляющих программные компоненты .

.NET Framework [ править ]

  • Шаблон модели асинхронного программирования (APM) (использовался до .NET Framework 2.0) [6]
  • Асинхронный шаблон на основе событий (EAP) (используется в .NET Framework 2.0) [7]
  • Асинхронный шаблон на основе задач (TAP) (используется в .NET Framework 4.0) [8]

Пример [ править ]

Следующий пример частично основан на стандартном стиле AMI, используемом в .NET Framework . [9] Для данного метода Accomplishдобавляются два новых метода BeginAccomplishи EndAccomplish:

class  Example  {  Result  Compleish ( args  )  IAsyncResult  BeginAccomplish ( args  )  Result  EndAccomplish ( IAsyncResult  a )  }

После вызова BeginAccomplishклиент немедленно получает объект типа AsyncResult(который реализует IAsyncResultинтерфейс), поэтому он может продолжить вызывающий поток, не выполняя никакой работы. В простейшем случае в конечном итоге такой работы больше нет, и клиент вызывает EndAccomplish(передавая ранее полученный объект), который блокируется до тех пор, пока метод не завершится и не станет доступен результат. [10]AsyncResult объект обычно содержит , по меньшей мере метод , который позволяет клиенту запроса , был ли длительный метод уже завершен:

интерфейс  IAsyncResult  {  bool  HasCompleted ()  }

Также можно передать метод обратного вызова BeginAccomplish, который будет вызываться после завершения длительного метода. Обычно он вызывается EndAccomplishдля получения возвращаемого значения долговременного метода. Проблема с механизмом обратного вызова заключается в том, что функция обратного вызова естественным образом выполняется в рабочем потоке (а не в исходном вызывающем потоке), что может вызвать состояние гонки. [11] [12]

В документации .NET Framework термин «асинхронный шаблон на основе событий» относится к альтернативному стилю API (доступному с .NET 2.0), использующему метод с именем AccomplishAsyncвместо BeginAccomplish. [13] [14] Внешнее отличие состоит в том, что в этом стиле возвращаемое значение длительного метода передается непосредственно методу обратного вызова. Что еще более важно, API использует специальный механизм для запуска метода обратного вызова (который находится в объекте события типа AccomplishCompleted) в том же потоке, в котором BeginAccomplishбыл вызван. Это устраняет опасность состояния гонки, делая API более простым в использовании и подходящим для программных компонентов; с другой стороны, эта реализация шаблона сопряжена с дополнительными накладными расходами на создание объектов и синхронизацию. [15]

Ссылки [ править ]

  1. ^ «Вызов асинхронного метода» . Распределенное программирование с помощью Ice . ZeroC, Inc. Архивировано из оригинала 5 января 2008 года . Проверено 22 Ноября 2 008 .
  2. ^ Vermeulen, Аллан (июнь 1996). «Асинхронный шаблон проектирования» . Журнал доктора Добба . Проверено 22 Ноября 2 008 .
  3. ^ Нэш, Трей (2007). «Многопоточность в C #». Ускоренный C # 2008 . Апресс. ISBN 978-1-59059-873-3.
  4. ^ Лаванда, Р. Грег; Дуглас С. Шмидт . «Активный объект» (PDF) . Архивировано из оригинального (PDF) 24 сентября 2012 года . Проверено 22 Ноября 2 008 . Цитировать журнал требует |journal=( помощь )
  5. ^ "Класс FutureTask" . Oracle. 2011. Архивировано из оригинала на 2013-06-25 . Проверено 29 июня 2015 .
  6. ^ «Модель асинхронного программирования» . Microsoft. 2015 . Проверено 29 июня 2015 .
  7. ^ «Обзор асинхронных шаблонов на основе событий» . Microsoft. 2015 . Проверено 29 июня 2015 .
  8. ^ «Асинхронный шаблон на основе задач» . Microsoft. 2015 . Проверено 29 июня 2015 .
  9. ^ "Шаблоны проектирования асинхронного программирования" . Руководство разработчика .NET Framework . Сеть разработчиков Microsoft. Архивировано 22 ноября 2008 года . Проверено 22 Ноября 2 008 .
  10. ^ «Обзор асинхронного программирования» . Руководство разработчика .NET Framework . Сеть разработчиков Microsoft. Архивировано 7 декабря 2008 года . Проверено 22 Ноября 2 008 .
  11. ^ «Использование делегата AsyncCallback для завершения асинхронной операции» . Руководство разработчика .NET Framework . Сеть разработчиков Microsoft. Архивировано 23 декабря 2008 года . Проверено 22 Ноября 2 008 .
  12. ^ «Проблемы параллелизма» . Распределенное программирование с помощью Ice . ZeroC, Inc. Архивировано из оригинала 28 марта 2008 года . Проверено 22 Ноября 2 008 .
  13. ^ Кристиан Нагель; Билл Эвьен; Джей Глинн; Карли Уотсон и Морган Скиннер (2008). «Асинхронный шаблон, основанный на событиях». Профессиональный C # 2008 . Вайли. С.  570 –571. ISBN 9780470191378.
  14. ^ «Многопоточное программирование с использованием асинхронного шаблона, основанного на событиях» . Руководство разработчика .NET Framework . Сеть разработчиков Microsoft. Архивировано 25 декабря 2008 года . Проверено 22 Ноября 2 008 .
  15. ^ «Решение, когда реализовать асинхронный шаблон на основе событий» . Руководство разработчика .NET Framework . Сеть разработчиков Microsoft. Архивировано 22 ноября 2008 года . Проверено 22 Ноября 2 008 .

Дальнейшее чтение [ править ]

  • Крис Селлс и Ян Гриффитс (2007). «Приложение C.3: Асинхронный шаблон, основанный на событиях». Программирование WPF . О'Рейли. стр.  747 -749. ISBN 9780596510374.
  • Использование асинхронных вызовов методов в C #