Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Blokada oczekiwania na element IAsyncResult
Blokowanie oczekiwania na wiele IAsyncResult obiektów
Sondowanie pod kątem ukończenia 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
- Instrukcje: implementowanie składnika obsługującego wzorzec asynchroniczny oparty na zdarzeniach
- Asynchroniczny wzorzec oparty na zdarzeniach (EAP)
- Implementowanie wzorca asynchronicznego opartego na zdarzeniach
- Najlepsze rozwiązania dotyczące implementowania wzorca asynchronicznego opartego na zdarzeniach
- Omówienie wzorca asynchronicznego opartego na zdarzeniach