События .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.