Udostępnij przez


Tworzenie i przetwarzanie wywołań asynchronicznych

Obiekty COM mogą obsługiwać wywołania asynchroniczne. Gdy klient wykonuje wywołanie asynchroniczne, kontrolka natychmiast wraca do klienta. Podczas gdy serwer przetwarza wywołanie, klient jest swobodny do wykonywania innych czynności. Gdy klient nie może już kontynuować bez wyników wywołania, może uzyskać wyniki wywołania w danym momencie.

Na przykład żądanie dużego lub złożonego zestawu rekordów może być czasochłonne. Klient może zażądać zestawu rekordów przez wywołanie asynchroniczne, a następnie wykonać inną pracę. Gdy zestaw rekordów jest dostępny, klient może go szybko uzyskać bez blokowania.

Klienci nie wykonują wywołań asynchronicznych bezpośrednio w obiekcie serwera. Zamiast tego uzyskują obiekt wywołania, który implementuje asynchroniczną wersję interfejsu synchronicznego na obiekcie serwera. Interfejs asynchroniczny obiektu wywołania ma nazwę formularza AsyncInterfaceName. Na przykład, jeśli obiekt serwera implementuje synchroniczny interfejs o nazwie IMyInterface, będzie istniał obiekt wywołania, który implementuje asynchroniczny interfejs o nazwie AsyncIMyInterface.

Notatka

Obsługa asynchroniczna nie jest dostępna dla IDispatch lub interfejsów dziedzicujących IDispatch.

 

Obiekty serwera obsługujące wywołania asynchroniczne implementują interfejs ICallFactory. Ten interfejs uwidacznia jedną metodę CreateCall, która tworzy wystąpienie określonego obiektu wywołania. Klienci mogą wysyłać zapytania dotyczące ICallFactory w celu określenia, czy obiekt obsługuje wywołania asynchroniczne.

Dla każdej metody w interfejsie synchronicznym odpowiedni interfejs asynchroniczny implementuje dwie metody. Te metody dołączają prefiksy Begin_ i Finish_ do nazwy metody synchronicznej. Jeśli na przykład interfejs o nazwie ISimpleStream ma metodę Read, interfejs AsyncISimpleStream będzie miał Begin_Read i metodę Finish_Read. Aby rozpocząć wywołanie asynchroniczne, klient wywołuje metodę Begin_.

Podczas implementowania obiektu serwera nie trzeba podawać obiektu wywołania dla każdego interfejsu, który obiekt implementuje. Jeśli obiekt serwera implementuje interfejs ICallFactory i używa standardowego marshalingu, marshalowany klient zawsze może uzyskać obiekt wywołania proxy, nawet jeśli nie ma obiektu wywołania po stronie serwera. Ten proxy, jako wywołanie synchroniczne, przeprowadzi marshaling metody Begin_, serwer przetworzy wywołanie synchronicznie, a klient może uzyskać parametry wyjściowe, wywołując metodę Finish_.

Z drugiej strony, jeśli klient wykonuje wywołanie synchroniczne marshaled na interfejsie, dla którego istnieje obiekt wywołania po stronie serwera, serwer zawsze przetwarza wywołanie asynchroniczne. To zachowanie nie będzie widoczne dla klienta, ponieważ klient otrzyma te same parametry wyjściowe i taką samą wartość zwracaną, jakie otrzymałby z metody synchronicznej.

W obu przypadkach interakcja między klientem a serwerem jest serializowana tak, jakby wywołanie było synchroniczne: dane wyjściowe synchronicznych i asynchronicznych serwerów proxy są nie do odróżnienia, podobnie jak dane wyjściowe odpowiednich stubów. To zachowanie znacznie upraszcza model programowania zarówno klientów, jak i serwerów. Jeśli obiekt serwera implementuje ICallFactory, zmarshlowany klient nie musi próbować utworzyć obiektu wywołania, który może być niedostępny — dla klienta obiekt wywołania jest zawsze dostępny.

Gdy klient i serwer znajdują się w tym samym mieszkaniu, obiekt serwera będzie przetwarzać niezależnie od tego, które wywołanie wykonuje klient. Jeśli obiekt wywołania jest niedostępny, klient musi jawnie uzyskać interfejs synchroniczny i wykonać wywołanie synchroniczne.

Aby uzyskać więcej informacji, zobacz następujące tematy: