Вся SetSynchronizationContext
- красная сельдь, это просто механизм сортировки, работа по-прежнему происходит в пуле потоков ввода-вывода.
То, что вы запрашиваете, - это способ ставить в очередь и собирать данные Асинхронные вызовы процедур для всей вашей работы ввода-вывода из основного потока.Многие высокоуровневые фреймворки обертывают такую функциональность, самой известной из которых является libevent .
. Здесь есть большое резюме по различным опциям: В чем разница между epoll, poll,Threadpool .
.NET уже позаботился о масштабировании для вас благодаря специальному «пулу потоков ввода-вывода», который обрабатывает доступ ввода-вывода при вызове методов BeginXYZ
.Этот пул потоков ввода-вывода должен иметь по крайней мере 1 поток на процессор на коробке.см .: ThreadPool.SetMaxThreads .
Если однопоточное приложение является критическим требованием (по какой-то безумной причине), вы, конечно, можете взаимодействовать со всем этим, используя DllImport (см. пример здесь )
Однако это будет очень сложное и рискованное задание :
Почему бы немы поддерживаем БТРы как механизм доработки?APC действительно не являются хорошим механизмом завершения общего назначения для пользовательского кода.Управление повторным входом, введенным БТР, практически невозможно;например, каждый раз, когда вы блокируете блокировку, произвольное завершение ввода-вывода может занять ваш поток.Он может попытаться получить собственные блокировки, что может привести к проблемам с порядком блокировки и, следовательно, к тупику.Предотвращение этого требует тщательного проектирования и способности гарантировать, что чужой код никогда не будет работать во время вашего ожидаемого ожидания, и наоборот.Это сильно ограничивает полезность БТРов.
Итак, подведем итог.Если вам нужен однопоточный управляемый процесс , который выполняет всю свою работу с использованием APC и портов завершения, вам придется вручную его кодировать.Строить это было бы рискованно и сложно.
Если вам просто нужна высокопроизводительная сеть, вы можете продолжать использовать BeginXYZ
и семью, и будьте уверены, что он будет работать хорошо, поскольку использует APC.Вы платите небольшую цену за сортировку между потоками и конкретной реализацией .NET.
From: http://msdn.microsoft.com/en-us/magazine/cc300760.aspx
Следующим шагом в расширении сервера является использование асинхронного ввода-вывода.Асинхронный ввод-вывод избавляет от необходимости создавать и управлять потоками.Это приводит к гораздо более простому коду, а также к более эффективной модели ввода / вывода.Асинхронный ввод-вывод использует обратные вызовы для обработки входящих данных и соединений, что означает, что нет списков для настройки и сканирования, и нет необходимости создавать новые рабочие потоки для обработки ожидающих операций ввода-вывода.
Интересным, побочным фактом является то, что однопоточный не самый быстрый способ сделать асинхронные сокеты в Windows с использованием портов завершения, см .: http://doc.sch130.nsc.ru/www.sysinternals.com/ntw2k/info/comport.shtml
Цель сервера состоит в том, чтобывыполнять как можно меньше переключений контекста, так как его потоки избегают ненужной блокировки, и в то же время максимизируют параллелизм за счет использования нескольких потоков.В идеале должен быть поток, активно обслуживающий клиентский запрос на каждом процессоре, и чтобы эти потоки не блокировались, если есть дополнительные запросы, ожидающие, когда они завершат запрос.Однако, чтобы это работало правильно, у приложения должен быть способ активировать другой поток, когда одна обработка клиентского запроса блокирует ввод-вывод (например, когда он читает из файла как часть обработки).