2009-07-03 71 views
8

我嘗試了很多開源軟件,並且我注意到在開源世界中有相當數量的服務器類型應用程序使用libevent來促進基於事件的處理,而不是產生多個線程處理請求。我也做了很多.NET編程(這是我的核心工作職能),並且我很想學習libevent如何與.NET事件模型相關聯。 .NET中的事件等同於C程序的libevent?我應該嘗試學習libevent並嘗試在自定義的.NET服務器應用程序中使用它,或者使用標準的.NET事件模型基本上是一樣的嗎?libevent,windows和.NET編程

回答

8

.NET事件和libevent並不相同,儘管它們共享抽象概念。

.NET事件允許CLR組件之間的非確定性通信。 In C#,組件是一個對象 - 事件是類成員。在其他語言中,like F#,對象不是必需的。一個事件允許消費者訂閱在源中特定條件下發生的通知 - 單擊按鈕,下載完成,發生異常等。.NET事件的一些特徵:

  • 它們是不綁定到底層操作系統
  • 您可以爲任何條件定義事件。
  • 它們本質上不是異步的(通知程序和通知不一定在同一時間運行,儘管它們可以)。

的libevent允許OS和消費者之間的非確定性的,異步通信。這可能與.NET事件類似,因爲它們都是反轉控制,但機制有很大不同。

  • libevent使用操作系統特定的非阻塞I/O(/dev/poll, kqueue, epoll)來提高性能。您的結果將因您使用的操作系統和機制而異。
  • libevent事件條件包括文件描述符,OS信號或超時的狀態更改。您無法定義任意回調條件。
  • libevent本質上是異步的。消費者在等待操作系統返回時不會阻塞。

我應該努力學習的libevent和 嘗試在自定義.NET 服務器應用程序使用它...?

如果你是爲了好玩而做的,當然。如果你是爲了工作而做的,可能不是。 libevent聲稱它在* nix系統上表現最大。 Windows使用不同的網絡範例。版本2中的libevent開發者是addressing these differences,但2.0.5仍然是beta版本。

此外,.NET還提供了自己的非阻塞I/O庫including asynchronous sockets