Udostępnij za pośrednictwem


Decydowanie o czasie implementacji klienta wzorca asynchronicznego opartego 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).

Ogólne zasady

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 IAsyncResult wzorca oprócz wzorca opartego na zdarzeniach.

Uwaga

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 interfejsem API może wymagać uwidocznienia IAsyncResult wzorca.

  • 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.

  • Skompiluj implementację wzorca opartego na zdarzeniach na implementacji IAsyncResult wzorca.

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

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

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

    • Jeśli musisz uwidocznić zarówno wzorzec oparty na zdarzeniach, jak i IAsyncResult wzorzec w pojedynczej klasie, użyj EditorBrowsableAttribute wartości , aby oznaczyć Advanced implementację IAsyncResult wzorca jako funkcję zaawansowaną. Oznacza to, że środowiska projektowe, takie jak Funkcja IntelliSense programu Visual Studio, nie IAsyncResult wyświetlają 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

Mimo że wzorzec asynchroniczny oparty na zdarzeniach ma wiele korzyści w poprzednich scenariuszach, ma pewne wady, które należy wiedzieć, czy wydajność jest najważniejszym wymaganiem.

Istnieją trzy scenariusze, dla których wzorzec oparty na zdarzeniach nie dotyczy, a także IAsyncResult wzorca:

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 scenariusza ukończenia jest techniką serwera 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 IAsyncResult wzorzec tylko wtedy, gdy wymagasz obsługi WaitHandle obiektów 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 IAsyncResult wzorzec tylko wtedy, gdy masz wymagania dotyczące wysokiej wydajności, których zweryfikowano, nie można spełnić za pomocą wzorca opartego IAsyncResult na zdarzeniach, ale można go spełnić.

Zobacz też