2009-07-25 4 views
1

Я знаю, что .NET имеет хорошую асинхронную модель для сетевого ввода-вывода, которая использует порт завершения под капотом. Но все обратные вызовы происходят из потоков ввода-вывода из пула потоков..NET equvalent селектора NIO Java

Есть ли какие-либо .NET-коллеги, такие как селектор Java, который имеет дело с несколькими потоками в одном потоке? Или обратные вызовы пула потоков лучше, чем этот однопоточный подход?

Спасибо,

Додд

+0

Я думаю, что у меня есть все: есть Socket.Select в .NET. – 2009-07-25 06:13:51

+0

Теперь мой вопрос, который лучше масштабируется на стороне сервера, select() или BeginAccept()? – 2009-07-25 06:17:01

ответ

2

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

Надеется, что это помогает

EDIT: Добавлению ответа на комментарий Додда

Я не близко знаком с Selector API, но глядя на примере, публикуемой here, кажется, что селектор ожидает, пока не произойдут все события. Это правда? Если это так, то вызывающему абоненту придется ждать, пока произойдут все события, даже когда одно событие произойдет раньше другого. Но если селектор работает, обрабатывая событие, как только оно происходит, можно столкнуться с ситуацией, когда селектор обрабатывает обратный вызов для одного события, пока приходит другое событие (я бы предположил, что в этом случае входящее событие будет поставлено в очередь где-то, иначе вы бы отбросили события), но это все равно уменьшит пропускную способность, когда события будут ортогональными и должны быть обработаны, как только они появятся.

Асинхронная модель в .NET сосредоточена вокруг пула потоков, чтобы уменьшить накладные расходы на создание нового потока (поскольку это дорогостоящая операция). Если вы наблюдаете, что пул потоков максимизирован, вы можете увеличить количество потоков в пуле, как documented здесь. Имейте в виду, что в конце дня вы ограничены количеством процессоров i.e В двухъядерном ядре можно активно запускать только 2 потока, все остальные блокируются, так что это может быть что-то, что нужно учитывать.

Надеюсь, это поможет.

+0

ThreadPool и алгоритм планирования претерпевают капитальный ремонт в .NET4 для поддержки TPL и более эффективного планирования потоков (Задачи) –

0

Благодаря Abhijeet,

Ну, мое дело в том, что в некоторых очень занят senarios многие асинхронные обратные вызовы происходят одновременно, и мы бежим из нитей: то переключение контекста будет кошмар. В этом конкретном случае, асинхронный обратный вызов правильный выбор? Или мы должны использовать Select()?

+0

Microsoft уже восемь лет выяснила, является ли это проблемой. –

+0

Эй, Додд, это должен быть комментарий к вопросу @ Абхиджит, а не новый ответ (добро пожаловать в SO кстати.) –

+0

@Dodd: Я добавлю свой ответ (ниже) –