Rozhodování, kdy implementovat asynchronní vzor založený na událostech

Asynchronní vzor založený na událostech poskytuje vzor pro zveřejnění asynchronního chování třídy. Při zavedení tohoto modelu definuje .NET dva vzory pro zveřejnění asynchronního chování: asynchronní vzor založený na rozhraní a vzor založený na System.IAsyncResult událostech. Tento článek popisuje, kdy je vhodné implementovat oba vzory.

Další informace o asynchronním programování pomocí IAsyncResult rozhraní naleznete v tématu Asynchronní programovací model (APM).

Obecné principy

Obecně byste měli zveřejnit asynchronní funkce pomocí asynchronního vzoru založeného na událostech, kdykoli je to možné. Existuje však několik požadavků, které model založený na událostech nemůže splnit. V těchto případech možná budete muset model implementovat IAsyncResult kromě vzoru založeného na událostech.

Poznámka:

Model je zřídka IAsyncResult implementovaný bez implementace vzoru založeného na událostech.

Pokyny

Následující seznam popisuje pokyny pro implementaci asynchronního vzoru založeného na událostech:

  • Vzor založený na událostech použijte jako výchozí rozhraní API k zveřejnění asynchronního chování pro vaši třídu.

  • Nevystavujte IAsyncResult vzor, pokud se vaše třída primárně používá v klientské aplikaci, například model Windows Forms.

  • Vzor zpřístupněte IAsyncResult jenom v případě, že je to nezbytné pro splnění vašich požadavků. Například kompatibilita s existujícím rozhraním API může vyžadovat zveřejnění IAsyncResult vzoru.

  • Nezpřístupňujte IAsyncResult vzor bez vystavení vzoru založeného na událostech.

  • Pokud ho IAsyncResult musíte zveřejnit, udělejte to jako pokročilou možnost. Pokud například vygenerujete objekt proxy, ve výchozím nastavení vygenerujte vzor založený na událostech s možností vygenerovat IAsyncResult vzor.

  • Sestavte implementaci vzoru založeného na událostech na implementaci modelu IAsyncResult .

  • Vyhněte se vystavení vzoru založeného IAsyncResult na událostech i vzoru ve stejné třídě. Zpřístupňte vzor založený na událostech na třídách vyšší úrovně a IAsyncResult vzor u tříd nižší úrovně. Porovnejte například vzor založený na událostech na komponentě WebClient se vzorem IAsyncResult ve HttpRequest třídě.

    • V případě, že to vyžaduje kompatibilita, zpřístupňte vzor založený na událostech a IAsyncResult vzor ve stejné třídě. Pokud jste například už vydali rozhraní API, které tento model používá IAsyncResult , budete muset zachovat vzor pro zpětnou kompatibilitu IAsyncResult .

    • Vystavit vzor založený na událostech a vzor ve IAsyncResult stejné třídě, pokud složitost výsledného objektového modelu převáží výhodu oddělení implementací. Je lepší zveřejnit oba vzory v jedné třídě, než aby se zabránilo vystavení vzoru založeného na událostech.

    • Pokud je nutné zveřejnit vzor založený na událostech i IAsyncResult vzor v jedné třídě, použijte EditorBrowsableAttribute sadu pro Advanced označení IAsyncResult implementace vzoru jako pokročilou funkci. To značí návrh prostředí, jako je například Visual Studio IntelliSense, aby se nezobrazovat IAsyncResult vlastnosti a metody. Tyto vlastnosti a metody jsou stále plně použitelné, ale vývojář, který pracuje přes IntelliSense, má jasnější zobrazení rozhraní API.

Kritéria pro zveřejnění vzoru IAsyncResult kromě vzoru založeného na událostech

Asynchronní vzor založený na událostech má v předchozích scénářích mnoho výhod, ale má určité nevýhody, o kterých byste měli vědět, jestli je výkon vaším nejdůležitějším požadavkem.

Existují tři scénáře, které model založený na událostech neřeší ani IAsyncResult vzor:

Tyto scénáře můžete řešit pomocí vzoru založeného na událostech, ale je to složitější než použití IAsyncResult vzoru.

Vývojáři často používají IAsyncResult model pro služby, které mají obvykle velmi vysoké požadavky na výkon. Například dotazování na scénář dokončení je technika serveru s vysokým výkonem.

Kromě toho je model založený na událostech méně efektivní než IAsyncResult model, protože vytváří více objektů, zejména EventArgs, a protože se synchronizuje napříč vlákny.

Následující seznam obsahuje několik doporučení, která byste měli dodržovat, pokud se rozhodnete použít IAsyncResult tento vzor:

  • Vystavit IAsyncResult vzor pouze v případě, že výslovně potřebujete podporu pro WaitHandle objekty nebo IAsyncResult objekty.

  • Vzor zveřejníte IAsyncResult jenom v případech, kdy máte existující rozhraní API, které tento vzor používá IAsyncResult .

  • Pokud máte existující rozhraní API založené na vzoru, zvažte také zveřejnění vzoru založeného na IAsyncResult událostech v příští verzi.

  • Vystavit IAsyncResult vzor pouze v případě, že máte vysoké požadavky na výkon, které jste ověřili, nelze splnit vzorem založeným na událostech, ale lze ho IAsyncResult splnit.

Viz také