Udostępnij przez


Wykonywanie wywołania asynchronicznego

Procedura tworzenia wywołania synchronicznego jest prosta: klient uzyskuje wskaźnik interfejsu na obiekcie serwera i wywołuje metody za pomocą tego wskaźnika. Wywołanie asynchroniczne obejmuje obiekt wywołania, więc obejmuje kilka kolejnych kroków.

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

Aby rozpocząć asynchroniczne wywołanie

  1. Wykonaj zapytanie o obiekt serwera dla interfejsuICallFactory. Jeśli QueryInterface zwraca E_NOINTERFACE, obiekt serwera nie obsługuje wywołania asynchronicznego.

  2. Wywołaj metodę ICallFactory::CreateCall, aby utworzyć obiekt wywołania odpowiadający żądanemu interfejsowi, a następnie zwolnij wskaźnik do ICallFactory.

  3. Jeśli nie zażądałeś wskaźnika do interfejsu asynchronicznego przy użyciu wywołania metody CreateCall, zapytaj obiekt wywołania o interfejs asynchroniczny.

  4. Wywołaj odpowiednią metodę Begin_.

Obiekt serwera przetwarza teraz wywołanie asynchroniczne, a klient może wykonać inną pracę, dopóki nie będzie potrzebował wyników wywołania.

Obiekt wywołania może przetwarzać tylko jedno wywołanie asynchroniczne jednocześnie. Jeśli ten sam lub drugi klient wywołuje metodę Begin_ przed zakończeniem oczekującego wywołania asynchronicznego, metoda Begin_ zwróci RPC_E_CALL_PENDING.

Jeśli klient nie potrzebuje wyników metody Begin_, może zwolnić obiekt wywołania na końcu tej procedury. COM wykrywa tę sytuację i naprawia wywołanie. Metoda Finish_ nie jest wywoływana, a klient nie pobiera żadnych parametrów lub zwracanej wartości.

Gdy obiekt serwera jest gotowy, aby zakończyć metodę Begin_, sygnalizuje obiektowi wywołania, że zadanie zostało ukończone. Gdy klient jest gotowy, sprawdza, czy obiekt wywołania został zasygnalizowany. Jeśli tak, klient może ukończyć wywołanie asynchroniczne.

Mechanizmem sygnalizowania i sprawdzania między klientem a serwerem jest interfejs ISynchronize w obiekcie wywołania. Obiekt wywołania zwykle implementuje ten interfejs przez agregowanie obiektu synchronizacji dostarczonego przez system. Obiekt synchronizacji opakowuje uchwyt zdarzenia, które serwer sygnalizuje tuż przed powrotem z metody Begin_ przez wywołanie ISynchronize::Signal.

Aby ukończyć asynchroniczne wywołanie

  1. Zapytaj obiekt wywołania o interfejs ISynchronize.

  2. Wywołaj ISynchronize::Wait.

  3. Jeśli Wait zwróci RPC_E_TIMEOUT, metoda Begin_ nie zakończy przetwarzania. Klient może kontynuować pracę i wywołać wait później. Nie może wywołać metody Finish_, dopóki Wait nie zwróci S_OK.

    Jeśli wait zwraca S_OK, metoda Begin_ została zwrócona. Wywołaj odpowiednią metodę Finish_.

Metoda Finish_ przekazuje klientowi wszystkie parametry wychodzące. Zachowanie metod asynchronicznych, w tym wartość zwracana metody Finish_, powinna być zgodna dokładnie z odpowiednią metodą synchroniczną.

Klient może zwolnić obiekt wywołania zaraz po powrocie metody Finish_ lub może przechowywać wskaźnik do obiektu wywołania w celu wykonania dodatkowych wywołań. W obu przypadkach klient jest odpowiedzialny za zwolnienie obiektu wywołania, gdy obiekt nie jest już potrzebny.

Jeśli wywołasz metodę Finish_, gdy żadne połączenie nie jest w toku, metoda zwraca RPC_E_CALL_COMPLETE.

Notatka

Jeśli obiekty klienta i serwera znajdują się w tym samym mieszkaniu, wywołania ICallFactory::CreateCall nie mają gwarancji, że powiedzie się. Jeśli obiekt serwera nie obsługuje asynchronicznego wywoływania dla określonego interfejsu, próba utworzenia obiektu wywołania zakończy się niepowodzeniem, a klient musi użyć interfejsu synchronicznego.

 

anulowanie asynchronicznego wywołania

Ochrona klienta podczas asynchronicznego wywołania

Podszywanie się i wywołania asynchroniczne