В C # .NET асинхронная операция обязательно создает поток, который блокирует? - PullRequest
7 голосов
/ 06 марта 2012

Это более общий вопрос относительно асинхронных шаблонов в C # .NET, описанный здесь MSDN .

Когда требуется длительная синхронная операция 1006 * длявызываться (например, - WCF, запрос к базе данных, ввод-вывод и т. д.), и я не хочу, чтобы поток блокировался (например, - поток с графическим интерфейсом), означает ли это, что где-то должен существовать другой поток, который выполняет блокировку?

Требует ли выполнение синхронного вызова асинхронного потока где-нибудь для блокировки?

Итак, если я сделаю 10 длительных асинхронных вызовов (которые на самом деле являются 10 синхронными вызовами), должны ли 10 потоков делать ожидание?Или есть механизм, предотвращающий блокировку 10 потоков?

В WCF вы можете создать методы Begin и End для вызова WCF, чтобы сделать его асинхронным.Означает ли это, что когда я вызываю этот асинхронный метод, где-то есть поток, либо на клиенте, либо на сервере, который ожидает меня?

Я прочитал несколько статей о различных методах для достижения асинхронности,но эти статьи не объясняют, что делается под капотом.

Обновление

Я сделал свой вопрос более конкретным, так как меня больше интересует.СЕТЬ.асинхронные шаблоны, описанные MSDN .

Обновление 2

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

Ответы [ 5 ]

7 голосов
/ 06 марта 2012

В .NET Framework существует много способов реализации асинхронной операции: с помощью потока, пула потоков, методов BeginXxx и EndXxx, APM на основе событий или APM на основе задач.

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

Ниже приведено краткое описание всехАсинхронные шаблоны для краткого справочника: Async Summary:

Более того, Джеффри Рихтер также хорошо объясняет модель асинхронного программирования CLR в журнале MSDN.

3 голосов
/ 06 марта 2012

Это не обязательно один поток на операцию. Как говорит @Ioannis Karadimas, это, скорее всего, зависит от реализации.

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

2 голосов
/ 06 марта 2012

'Итак, если я сделаю 10 длительных асинхронных вызовов, должны ли 10 потоков выполнять ожидание?'В общем нет.

'Или есть механизм, предотвращающий блокировку 10 потоков?'- существуют механизмы, позволяющие одному блокирующему потоку обрабатывать несколько элементов.Простой пример - поток ядра может ожидать сигнала NIC и семафора входной очереди - обычно он блокируется в ожидании одного или другого.Ваше асинхронное пользовательское приложение ставит в очередь сетевую отправку, а поток ядра получает ее из очереди и пытается отправить ее на оборудование сетевой карты.Если это невозможно, он добавляет его во внутреннюю очередь отправки и возвращает в ваше приложение с ответом «WOULD_BLOCK».Когда оборудование готово, оно сигнализирует потоку ядра, который удаляет из буфера отправки и загружает его на оборудование.Точно так же ваше приложение отправляет один или несколько асинхронных запросов recv () (с буферами), и поток ядра добавляет его в список и возвращает с ответом «WOULD_BLOCK».Когда данные поступают в NIC, его драйвер сигнализирует, и поток ядра проверяет данные и пытается найти в своем списке запись, которая ожидает эти данные.Если это данные для вашего приложения, он копирует / DMA данные из аппаратного обеспечения в ваши буферы и вызывает ваш асинхронный обратный вызов (обратите внимание, как именно вызывается ваш обратный вызов asycn и в каком потоке зависит от ОС. Возможно, APCставится в очередь в вашем потоке GUI, или структура завершения IOCP ставится в очередь в пуле пользовательских потоков.)или recv элемент списка.Всякий раз, когда оборудование или его входная очередь требуют внимания, оно запускается и обрабатывает его, в противном случае оно остается заблокированным.

2 голосов
/ 06 марта 2012

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

1 голос
/ 13 мая 2015

Нет, не будет ожидание потока, если вы сделаете асинхронный вызов с использованием библиотек Framework.напримерКак и в вашем случае использования, вы упомянули «В WCF вы можете создать методы Begin и End для вызова WCF, чтобы сделать его асинхронным. Означает ли это, что когда я вызываю этот асинхронный метод, где-то есть поток, либо на клиенте, либосервер, который ждет меня? "

Не будет никакого потока, ожидающего завершения асинхронной операции, более подробную информацию вы можете посмотреть в этом отличном блоге http://blog.stephencleary.com/2013/11/there-is-no-thread.html

...