Vytváření a zpracování asynchronních volání

Objekty MODELU COM mohou podporovat asynchronní volání. Když klient provede asynchronní volání, ovládací prvek se okamžitě vrátí klientovi. Zatímco server zpracovává volání, klient může provádět jinou práci. Pokud už klient nemůže pokračovat bez výsledků volání, může v tuto chvíli získat výsledky volání.

Například požadavek na velkou nebo složitou sadu záznamů může být časově náročný. Klient může požádat sadu záznamů asynchronním voláním a pak provést jinou práci. Jakmile je sada záznamů k dispozici, klient ji může rychle získat bez blokování.

Klienti nedělají asynchronní volání přímo na objekt serveru. Místo toho získají objekt volání, který implementuje asynchronní verzi synchronního rozhraní na objekt serveru. Asynchronní rozhraní v objektu volání má název formuláře AsyncInterfaceName. Pokud například objekt serveru implementuje synchronní rozhraní S názvem IMyInterface, bude k dispozici objekt volání, který implementuje asynchronní rozhraní s názvem AsyncIMyInterface.

Poznámka

Asynchronní podpora není k dispozici pro IDispatch ani pro rozhraní která odvozují IDispatch.

 

Objekty serveru, které podporují asynchronní volání, implementují rozhraní ICallFactory. Toto rozhraní zveřejňuje jednu metodu, CreateCall, který vytvoří instanci zadaného objektu volání. Klienti se mohou dotazovat na ICallFactory, aby určili, zda objekt podporuje asynchronní volání.

Pro každou metodu v synchronním rozhraní implementuje odpovídající asynchronní rozhraní dvě metody. Tyto metody připojují předpony Begin_ a Finish_ k názvu synchronní metody. Pokud má například rozhraní s názvem ISimpleStream metodu Read, rozhraní AsyncISimpleStream bude mít Begin_Read a Finish_Read metodu. Chcete-li zahájit asynchronní volání, klient volá metodu Begin_.

Při implementaci objektu serveru nemusíte zadávat objekt volání pro každé rozhraní, které objekt implementuje. Pokud objekt serveru implementuje rozhraní ICallFactory a používá standardní zařazování, maršálovaný klient může vždy získat proxy volací objekt, i když na straně serveru není žádný objekt volání. Tento proxy server zařadí metodu Begin_ jako synchronní volání, server zpracuje volání synchronně a klient může získat výstupní parametry voláním metody Finish_.

Pokud klient naopak provede zařazované synchronní volání na rozhraní, pro které je na straně serveru objekt volání, server bude vždy zpracovávat volání asynchronně. Toto chování nebude pro klienta zřejmé, protože klient obdrží stejné výstupní parametry a stejnou návratovou hodnotu, kterou by obdržel ze synchronní metody.

V obou případech je interakce mezi klientem a serverem uspořádána, jako by volání bylo synchronní: Výstup synchronních a asynchronních proxy je nerozlišitelný, stejně jako výstup odpovídajících stubbů. Toto chování výrazně zjednodušuje programovací model jak klientů, tak serverů. Pokud serverový objekt implementuje ICallFactory, zařazovaný klient se nemusí pokoušet vytvořit objekt volání, který nemusí být k dispozici – pro klienta, volající objekt je vždy k dispozici.

Pokud jsou klient a server ve stejném prostředí, objekt serveru zpracuje jakýkoli hovor klient uskuteční. Pokud objekt volání není k dispozici, klient musí explicitně získat synchronní rozhraní a provést synchronní volání.

Další informace najdete v následujících tématech: