2009-07-03 4 views
8

Я экспериментирую с большим количеством программного обеспечения с открытым исходным кодом, и я заметил, что множество приложений типа сервера в мире с открытым исходным кодом используют libevent для облегчения обработки на основе событий, а не для создания нескольких потоков для обрабатывать запросы.libevent, windows и .NET-программирование

Я также много программирую .NET (это моя основная функция работы), и мне интересно узнать, как libevent относится к модели событий .NET. Являются ли события в .NET эквивалентными libevent для программ на C? Должен ли я попытаться изучить libevent и попытаться использовать его в пользовательских .NET-приложениях или использовать стандартную модель событий .NET в основном то же самое?

ответ

8

События .NET и libevent не эквивалентны, хотя они разделяют абстрактные понятия.

События .NET допускают недетерминированную связь между компонентами среды CLR. In C#, компонент - это объект - события являются членами класса. На других языках, like F#, объекты не требуются. Событие позволяет потребителям подписаться на уведомления, которые происходят на определенных условиях в источнике - кнопка нажата, загрузка будет завершена, произошло исключение, и т.д. Несколько характеристик .NET событий:

  • Они не привязаны к базовой ОС
  • Вы можете определить события для любого условия.
  • Они не являются по сути асинхронными (уведомитель и уведомление не обязательно работают одновременно, хотя они могут быть).

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

  • libevent использует OS-специфический, неблокирующий ввод-вывод (/dev/poll, kqueue, epoll) для повышения производительности. Ваши результаты будут различаться в зависимости от используемой ОС и используемого вами механизма.
  • Условия события libevent включают изменения состояния файловых дескрипторов, сигналов ОС или тайм-аутов. Вы не можете определить произвольные условия обратного вызова.
  • libevent по своей сути асинхронен. Потребитель не блокируется, ожидая возвращения ОС.

Должен ли я попытаться узнать Libevent и попытки использовать его в пользовательском .NET серверных приложениях ...?

Если вы делаете это для удовольствия, конечно. Если вы делаете это для работы, возможно, нет. libevent заявляет о своей наибольшей производительности в системах * nix. Windows использует другую сетевую парадигму. Разработчики libevent - addressing these differences в версии 2, но 2.0.5 по-прежнему является бета-версией.

Кроме того, .NET предлагает свои собственные неблокирующие библиотеки ввода-вывода including asynchronous sockets.