基於事件的非同步模式提供了一種模式,可以用來揭示類別的非同步運作方式。 引進此模式時,.NET 會定義兩種模式來公開非同步行為:以 System.IAsyncResult 介面為基礎的非同步模式,以及基於事件的模式。 本文說明何時適合您實作這兩種模式。
如需使用 IAsyncResult 介面進行異步程序設計的詳細資訊,請參閱異步程序設計模型(APM)。
一般原則
一般而言,您應該盡可能使用事件架構異步模式公開異步功能。 不過,事件架構模式無法符合某些需求。 在這些情況下,除了事件型模式之外,您可能需要實作 IAsyncResult 模式。
備註
在實作 IAsyncResult 模式時,若未同時實作事件驅動模式的情況相當稀少。
指導方針
下列清單說明何時應實作事件架構異步模式的指導方針:
使用事件驅動模式作為預設 API,以使類別具備非同步行為。
當您的類別主要用於用戶端應用程式時,請勿公開 IAsyncResult 模式,例如 Windows Forms。
只有在符合您的需求時,才公開 IAsyncResult 模式。 例如,與現有 API 的相容性可能需要您公開 IAsyncResult 模式。
請勿在不同時公開事件架構模式的情況下公開 IAsyncResult 模式。
如果您必須顯示 IAsyncResult 模式,請作為進階選項。 例如,如果您產生 Proxy 物件,則預設會產生事件型模式,並具有產生 IAsyncResult 模式的選項。
請在您的IAsyncResult 模式實作上構建事件型模式實作。
請避免在相同類別上公開事件型模式和 IAsyncResult 模式。 公開「較高層級」類別的事件型模式,以及「較低層級」類別的IAsyncResult模式。 例如,比較元件上的 WebClient 事件型模式與 IAsyncResult 類別上的 HttpRequest 模式。
當相容性需要時,公開相同類別上的事件架構模式和 IAsyncResult 模式。 例如,如果您已經釋出一個使用IAsyncResult模式的API,您需要保留IAsyncResult模式以確保向後相容性。
如果產生的物件模型複雜度超過分隔實作的優點,請公開相同類別上的事件模式和 IAsyncResult 模式。 最好在單一類別上公開這兩種模式,而不是避免公開事件型模式。
如果您必須在單一類別上公開事件型模式和 IAsyncResult 模式,請將 EditorBrowsableAttribute 設定為 Advanced,以將 IAsyncResult 的模式實作標記為進階功能。 這表示在設計環境中,例如 Visual Studio IntelliSense,不顯示 IAsyncResult 屬性和方法。 這些屬性和方法仍然完全可用,但透過 IntelliSense 工作的開發人員有更清楚的 API 檢視。
除了事件架構模式之外,公開 IAsyncResult 模式的準則
雖然事件架構異步模式在先前提到的案例中有許多優點,但它確實有一些缺點,您應該知道效能是否為最重要的需求。
事件驅動模式在三種情境下,處理得不如 IAsyncResult 模式好:
封鎖等候一個 IAsyncResult
封鎖許多 IAsyncResult 物件的等候
偵測 IAsyncResult 的完成進度
您可以使用事件型模式來解決這些案例,但這樣做比使用 IAsyncResult 模式更麻煩。
開發人員通常會使用 IAsyncResult 模式來應用於高效能需求的服務。 例如,輪詢完成用例是高效能伺服器技術。
此外,事件型模式的效率比 IAsyncResult 模式低,因為它會建立更多物件,特別是 EventArgs,而且因為它會在線程之間同步處理。
如果您決定使用 IAsyncResult 模式,下列清單會顯示一些要遵循的建議:
只有在您特別需要對IAsyncResult或WaitHandle物件的支援時,才公開IAsyncResult模式。
只有在您有使用IAsyncResult模式的現有 API 時,才會公開IAsyncResult模式。
若您已經有基於 IAsyncResult 模式的現有 API,建議於下一版本中也提供事件模式。
僅在您已驗證的高效能需求無法透過事件驅動模式達成,但可以透過IAsyncResult模式達成時,才公開IAsyncResult模式。
另請參閱
- 如何:實作支援事件架構異步模式的元件
- 事件驅動非同步模式 (EAP)
- 實現基於事件的非同步模式
- 實作事件架構異步模式的最佳做法
- 事件為基礎的非同步模式概述