Sdílet prostřednictvím


Rozhodování o implementaci asynchronního vzoru založeného 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 implementovat vzor IAsyncResult kromě vzoru založeného na událostech.

Poznámka:

Je vzácné, aby byl vzor IAsyncResult implementován bez toho, že by byl také implementován vzor založený 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 vzor IAsyncResult, pokud se vaše třída primárně používá v klientské aplikaci, například ve 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 musíte zveřejnit tento IAsyncResult vzor, 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 na událostech i vzoru IAsyncResult 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é používá vzor IAsyncResult, budete muset zachovat vzor IAsyncResult pro zpětnou kompatibilitu.

    • Zpřístupnit vzor založený na událostech a vzor s IAsyncResult na stejné třídě, pokud složitost výsledného objektového modelu převáží nad výhodami 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 nastavenou na Advanced, aby označila IAsyncResult implementaci vzoru jako pokročilou funkci. To označuje návrhovému prostředí, jako je například Visual Studio IntelliSense, aby se nezobrazovaly 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é vzor založený na událostech neřeší tak dobře jako 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 objekty WaitHandle nebo IAsyncResult.

  • 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 IAsyncResult, zvažte také zavedení vzoru založeného na událostech v příští verzi.

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

Viz také