2009-06-10 3 views
3

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

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

ответ

2

.NET Threads, Sockets и Event Handling имеют поддержку первого класса внутри C# и .NET, поэтому потребность в внешней библиотеке довольно светлая. В других словах, если вы знаете, что делаете, структура очень проста, чтобы перевернуть ваши собственные процедуры обработки событий сокета.

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

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

+5

Это, к сожалению, далеко от вопроса. Он спрашивает о шаблонах реактора/актера, и вы отвечаете о Threads and Sockets. – Henrik

4

brofield/C,

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

Алан,

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

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

4

Считать Asynchronous Programming in C# using Iterators;

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

3

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

0

Посмотрите на проект Interlace на код google. Мы используем это во всех наших продуктах.

Смежные вопросы