Как .NET использует IO Threads или IO Completion Ports?

У нас есть приложение .NET, которое делает несколько одновременных вызовов для различных веб-сервисов, собирает их ответы и затем делает несколько расчетов от этих ответов. При попытке получить дополнительную производительность я изучал использование подходов, использующих потоки .NET IO с использованием портов завершения ввода-вывода. Я прочитал несколько ресурсов, включая недавнюю книгу Джо Даффи "Совместное программирование в Windows", и пока я "получаю" их полезность, я немного неясен в отношении их поведения в .NET, и я ищу краткое объяснение.

Ответ 1

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

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

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

Следующее должно помочь описать это больше:

Порты ввода-вывода ввода/вывода:

http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx

Входы завершения ввода/вывода (WayBack Machine):

https://web.archive.org/web/20101101112358/http://doc.sch130.nsc.ru/www.sysinternals.com/ntw2k/info/comport.shtml