Требует ли асинхронный вызов дополнительного потока в текущем процессе или использования другого потока в пуле потоков? - PullRequest
1 голос
/ 17 сентября 2010

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

  • Я использую C #
  • Асинхронный процесс не делает ничего, кроме вызова внешнего API и ожидания ответа.

Ответы [ 3 ]

3 голосов
/ 17 сентября 2010

Ваш вопрос слишком общий. Windows API имеет специальную поддержку для асинхронного ввода-вывода без использования потока, проверьте документы для ReadFile (), например. Аргумент lpOverlapped управляет этим. Функция ReadFileEx () позволяет указать обратный вызов завершения ввода / вывода. Это хорошо охватывается классами .NET Framework.

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

3 голосов
/ 17 сентября 2010

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

Я сказал тамбыло одно исключение, которое пришло на ум.Если мы слегка извращаем наше определение асинхронности, мы можем допустить сценарии, в которых инициатор не блокирует ожидание завершения операции без фактического перемещения операции в другой поток.Лучший пример этого - насос сообщений интерфейса пользователя.В .NET достаточно просто вызвать Control.BeginInvoke из самого потока пользовательского интерфейса, чтобы опубликовать выполнение делегата в том же потоке.Очевидно, что инициатор не будет блокировать ожидание завершения делегата, и все же делегат в конечном итоге начнет выполняться в том же потоке.Это определенно извращение того, что мы обычно думаем о термине асинхронный, потому что в этом сценарии операция блокируется до тех пор, пока вызывающая сторона не завершит работу, а не наоборот.

2 голосов
/ 17 сентября 2010

Да, используется нить пула.Но эта нить не болтается в ожидании внешнего устройства.Поток используется повторно, и при завершении ввода-вывода вызывается (другой) поток.

См. Асинхронное завершение ввода-вывода в MSDN.

...