Udostępnij za pośrednictwem


Podejmowanie decyzji o tym, kiedy należy zaimplementować wzorzec asynchroniczny oparty na zdarzeniach

Wzorzec asynchroniczny oparty na zdarzeniach zapewnia wzorzec uwidaczniania asynchronicznego zachowania klasy. Wraz z wprowadzeniem tego wzorca platforma .NET definiuje dwa wzorce uwidaczniania zachowania asynchronicznego: wzorzec asynchroniczny oparty na interfejsie System.IAsyncResult i wzorzec oparty na zdarzeniach. W tym artykule opisano, kiedy należy zaimplementować oba wzorce.

Aby uzyskać więcej informacji na temat programowania asynchronicznego za pomocą interfejsu IAsyncResult , zobacz Asynchronous Programming Model (APM).

Zasady ogólne

Ogólnie rzecz biorąc, należy uwidocznić funkcje asynchroniczne przy użyciu asynchronicznego wzorca opartego na zdarzeniach, jeśli to możliwe. Istnieją jednak pewne wymagania, których wzorzec oparty na zdarzeniach nie może spełnić. W takich przypadkach może być konieczne zaimplementowanie wzorca IAsyncResult, oprócz wzorca opartego na zdarzeniach.

Uwaga / Notatka

Rzadko zdarza się, aby IAsyncResult wzorzec był implementowany bez implementowania wzorca opartego na zdarzeniach.

Wytyczne

Poniższa lista zawiera opis wytycznych dotyczących implementacji asynchronicznego wzorca opartego na zdarzeniach:

  • Użyj wzorca opartego na zdarzeniach jako domyślnego interfejsu API, aby uwidocznić zachowanie asynchroniczne dla klasy.

  • Nie ujawniaj IAsyncResult wzorca, gdy klasa jest używana głównie w aplikacji klienckiej, na przykład Windows Forms.

  • Uwidaczniaj IAsyncResult wzorzec tylko wtedy, gdy jest to konieczne do spełnienia wymagań. Na przykład zgodność z istniejącym API może wymagać uwidocznienia wzorca IAsyncResult.

  • Nie ujawniaj IAsyncResult wzorca bez uwidaczniania wzorca opartego na zdarzeniach.

  • Jeśli musisz uwidocznić IAsyncResult wzorzec, zrób to jako opcję zaawansowaną. Jeśli na przykład wygenerujesz obiekt proxy, wygeneruj domyślnie wzorzec oparty na zdarzeniach z opcją wygenerowania IAsyncResult wzorca.

  • Zbuduj implementację wzorca opartego na zdarzeniach na swojej implementacji wzorca IAsyncResult.

  • Unikaj uwidaczniania zarówno wzorca opartego na zdarzeniach, jak i IAsyncResult wzorca w tej samej klasie. Uwidaczniaj wzorzec oparty na zdarzeniach w klasach o "wyższym poziomie" i wzorzec IAsyncResult w klasach o "niższym poziomie". Na przykład porównaj wzorzec oparty na zdarzeniach na składniku WebClient ze IAsyncResult wzorcem HttpRequest klasy.

    • Udostępnij wzorzec oparty na zdarzeniach i wzorzec IAsyncResult w tej samej klasie, gdy zgodność tego wymaga. Jeśli na przykład został już wydany interfejs API, który używa wzorca IAsyncResult, należy zachować wzorzec IAsyncResult dla zgodności wstecznej.

    • Zastosowanie wzorca opartego na zdarzeniach i wzorca IAsyncResult w tej samej klasie, jeśli wynikowa złożoność modelu obiektów przewyższa korzyści z oddzielenia implementacji. Lepiej jest uwidocznić oba wzorce w jednej klasie niż unikać uwidaczniania wzorca opartego na zdarzeniach.

    • Jeśli musisz ujawnić zarówno wzorzec oparty na zdarzeniach, jak i wzorzec IAsyncResult w jednej klasie, użyj zestawu EditorBrowsableAttribute ustawionego na Advanced, aby oznaczyć implementację wzorca IAsyncResult jako funkcję zaawansowaną. Oznacza to, że środowiska projektowe, takie jak IntelliSense programu Visual Studio, nie wyświetlają IAsyncResult właściwości i metod. Te właściwości i metody są nadal w pełni użyteczne, ale deweloper pracujący za pomocą funkcji IntelliSense ma jaśniejszy widok interfejsu API.

Kryteria uwidaczniania wzorca IAsyncResult oprócz wzorca opartego na zdarzeniach

Chociaż wzorzec asynchroniczny oparty na zdarzeniach ma wiele korzyści w wcześniej wspomnianych scenariuszach, ma pewne wady, które należy być świadomym, jeśli wydajność jest najważniejszym wymaganiem.

Istnieją trzy scenariusze, które nie są tak dobrze obsługiwane przez wzorzec oparty na zdarzeniach jak przez wzorzec IAsyncResult.

Te scenariusze można rozwiązać przy użyciu wzorca opartego na zdarzeniach, ale jest to bardziej uciążliwe niż użycie IAsyncResult wzorca.

Deweloperzy często używają IAsyncResult wzorca dla usług, które zwykle mają bardzo wysokie wymagania dotyczące wydajności. Na przykład, sondowanie scenariuszy ukończenia jest techniką serwerową o wysokiej wydajności.

Ponadto wzorzec oparty na zdarzeniach jest mniej wydajny niż IAsyncResult wzorzec, ponieważ tworzy więcej obiektów, zwłaszcza EventArgs, i dlatego, że synchronizuje się między wątkami.

Poniższa lista zawiera kilka zaleceń, które należy wykonać, jeśli zdecydujesz się użyć IAsyncResult wzorca:

  • Uwidaczniaj wzorzec IAsyncResult tylko wtedy, gdy potrzebujesz obsługi obiektów WaitHandle lub IAsyncResult.

  • Uwidaczniaj IAsyncResult wzorzec tylko wtedy, gdy masz istniejący interfejs API, który używa IAsyncResult wzorca.

  • Jeśli masz istniejący interfejs API oparty na IAsyncResult wzorcu, rozważ również ujawnienie wzorca opartego na zdarzeniach w następnej wersji.

  • Uwidaczniaj wzorzec IAsyncResult tylko wtedy, gdy masz wymagania dotyczące wysokiej wydajności, które zweryfikowano jako niemożliwe do spełnienia za pomocą wzorca opartego na zdarzeniach IAsyncResult, ale możliwe do spełnienia za pomocą tego wzorca.

Zobacz także