Существует ли библиотека C # реакторов / проакторов? - PullRequest
3 голосов
/ 10 июня 2009

Я планирую переместить приложение Windows C ++ на C #, чтобы некоторые основные улучшения стали проще. Приложение C ++ является однопоточным и использует собственный шаблон реактора для обработки всех событий, связанных с принятием, чтением и записью сокетов и таймеров. Вся обработка сокетов выполняется асинхронно.

Каков приемлемый способ реализации схемы реактора C #? Существуют ли библиотеки?

Ответы [ 6 ]

4 голосов
/ 04 июля 2009

Иметь чтение Асинхронное программирование на C # с использованием итераторов ;

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

4 голосов
/ 04 июля 2009

brofield,

К сожалению, менталитет мира C # все еще находится в потоке для каждой области соединения. Я ищу способ обработки нескольких подключений в одной коробке Compact Framework / Windows CE и хочу написать свой собственный шаблон Proactor / Reactor (по аналогии с тем, который используется в ACE). Compact Framework, похоже, не поддерживает асинхронное подключение - просто асинхронное чтение и запись. Мне также нужно управлять жестким контролем времени ожидания (мягкое приложение реального времени).

Алан,

Одна из причин реализации схемы проактор / реактор состоит в том, что вам не нужно запускать поток для каждого соединения. Веб-сервер является классическим примером. Занятый сервер может легко иметь сотни активных соединений в любое время. С таким количеством потоков (а я видел реализации, в которых один поток читается, а другой - записывает данные), время, затрачиваемое на переключение контекста, становится значительным. В Windows CE на процессоре ARM с частотой 750 МГц я измерял миллисекунды с пиками до 4 миллисекунд.

Я все еще нахожу, что в большинстве приложений на C # и Java, с которыми я сталкивался, слишком много работающих потоков. Кажется, что решение для всего - начать другой поток. Пример. Eclipse (IDE) использует 44 потока еще до того, как я действительно открою проект. 44 темы ???? делать что именно ??? Поэтому Eclipse такой медленный?

3 голосов
/ 15 марта 2010

Ядро Windows имеет очень хороший API асинхронного ожидания, называемый портами завершения ввода / вывода, который очень хорош для реализации схемы реактора. К сожалению, библиотека System.Net.Sockets в .NET Framework не полностью предоставляет порты завершения ввода / вывода разработчикам. Самая большая проблема с System.Net.Sockets заключается в том, что у вас нет контроля над тем, какой поток заблокирует событие асинхронного завершения. Все ваши асинхронные завершения должны происходить в некотором случайном глобальном потоке .NET ThreadPool, выбранном для вас платформой.

2 голосов
/ 29 сентября 2012

Проверка СигналR . Это выглядит очень многообещающе.

2 голосов
/ 10 июня 2009

.NET Потоки, сокеты и обработка событий имеют поддержку первого класса в C # и .NET, поэтому потребность во внешней библиотеке довольно проста. Другими словами, если вы знаете, что делаете, фреймворк очень упрощает развертывание ваших собственных процедур обработки событий сокета.

Обе компании, в которых я работаю, обычно использовали библиотеку сокетов .NET по умолчанию, как и для всех сетевых подключений.

Изменить, чтобы добавить: в основном это означает, что это отличная возможность узнать о делегатах, событиях, потоках и сокетах в .NET / C #

0 голосов
/ 24 февраля 2012

Взгляните на проект Чересстрочная развертка по гугл-коду. Мы используем это во всех наших продуктах.

...