決定何時實作事件架構非同步模式

事件架構非同步模式提供的模式可公開類別的非同步行為。 引進此模式之後,.NET 定義兩種模式來公開非同步行為:以 System.IAsyncResult 介面為基礎的非同步模式與事件架構模式。 本文說明適合實作這兩種模式的時機。

如需使用 IAsyncResult 介面進行非同步程式設計的詳細資訊,請參閱非同步程式設計模型 (APM)

一般準則

一般而言,您應該儘可能使用事件架構非同步模式來公開非同步功能。 不過,事件架構模式無法符合一些需求。 在那些情況下,除了事件架構模式之外,您可能還必須實作 IAsyncResult 模式。

注意

實作 IAsyncResult 模式但未一併實作事件架構模式的情況非常罕見。

指導方針

下列清單說明實作事件架構非同步模式時的指導方針:

  • 使用事件架構模式作為預設 API 來公開類別的非同步行為。

  • 當您的類別主要用於用戶端應用程式 (例如 Windows Forms) 時,請不要公開 IAsyncResult 模式。

  • 只有在為符合您的需求時,才公開 IAsyncResult 模式。 例如,與現有 API 的相容性可能需要您公開 IAsyncResult 模式。

  • 沒有一併公開事件架構模式時,請不要公開 IAsyncResult 模式。

  • 如果您必須公開 IAsyncResult 模式,請以進階選項的方式執行此動作。 例如,如果您透過產生 IAsyncResult 模式的選項來產生 Proxy 物件,預設會產生事件架構模式。

  • 請在您的 IAsyncResult 模式實作上建置事件架構模式實作。

  • 避免在相同類別上公開這兩個事件架構模式和 IAsyncResult 模式。 在「較高層級的」類別上公開事件架構模式,並在「較低層級的」類別上公開 IAsyncResult 模式。 例如,比較 WebClient 元件上的事件架構模式與 HttpRequest 類別上的 IAsyncResult 模式。

    • 當基於相容性需要時,請在相同類別上公開事件架構模式與 IAsyncResult 模式。 例如,如果您已發行使用 IAsyncResult 模式的 API,則需要保留 IAsyncResult 模式以提供回溯相容性。

    • 如果產生的物件模型複雜度超過個別實作的優點,請在相同類別上公開事件架構模式與 IAsyncResult 模式。 最好在單一類別上公開這兩個模式,而不是避免公開事件架構模式。

    • 如果您必須在單一類別上公開事件架構模式和 IAsyncResult 模式,請以進階選項的方式,使用設為 AdvancedEditorBrowsableAttribute 來標示 IAsyncResult 模式實作。 這會向 Visual Studio IntelliSense 這類設計環境表示,不要顯示 IAsyncResult 屬性和方法。 這些屬性和方法仍完全可供使用,但透過 IntelliSense 處理的開發人員會有較清楚的 API 檢視。

除了公開事件架構模式之外還公開 IAsyncResult 模式的準則

雖然在先前所述的案例下,事件架構非同步模式有許多優點,但也有一些缺點,如果您最以效能為重,應多加注意。

有三種案例,事件架構模式與 IAsyncResult 模式都不會處理:

您可以使用事件架構模式來處理這些案例,但這樣做會比使用 IAsyncResult 模式更麻煩。

開發人員經常針對有極高效能需求的服務使用 IAsyncResult 模式。 例如,輪詢完成案例就是高效能伺服器技巧。

此外,因為事件架構模式會建立較多物件 (特別是 EventArgs) 且會跨執行緒進行同步處理,所以效率會比 IAsyncResult 差。

如果您決定使用 IAsyncResult 模式,下列清單顯示一些可遵循的建議:

另請參閱