Condividi tramite


Esecuzione di una chiamata asincrona

La procedura per effettuare una chiamata sincrona è semplice: il client ottiene un puntatore di interfaccia nell'oggetto server e chiama i metodi tramite tale puntatore. La chiamata asincrona comporta un oggetto chiamata, quindi comporta alcuni passaggi aggiuntivi.

Per ogni metodo in un'interfaccia sincrona, l'interfaccia asincrona corrispondente implementa due metodi. Questi metodi associano i prefissi Begin_ e Finish_ al nome del metodo sincrono. Ad esempio, se un'interfaccia denominata ISimpleStream ha un metodo Read, l'interfaccia AsyncISimpleStream avrà un Begin_Read e un metodo Finish_Read. Per avviare una chiamata asincrona, il client chiama il metodo Begin_.

Per avviare una chiamata asincrona

  1. Eseguire una query sull'oggetto server per l'interfaccia ICallFactory . Se QueryInterface restituisce E_NOINTERFACE, l'oggetto server non supporta la chiamata asincrona.

  2. Chiamare ICallFactory::CreateCall per creare un oggetto chiamata corrispondente all'interfaccia desiderata e quindi rilasciare il puntatore a ICallFactory.

  3. Se non è stato richiesto un puntatore all'interfaccia asincrona dalla chiamata a CreateCall, eseguire una query sull'oggetto chiamata per l'interfaccia asincrona.

  4. Chiamare il metodo Begin_ appropriato.

L'oggetto server sta ora elaborando la chiamata asincrona e il client è libero di eseguire altre operazioni fino a quando non richiede i risultati della chiamata.

Un oggetto chiamata può elaborare una sola chiamata asincrona alla volta. Se lo stesso o un secondo client chiama un metodo Begin_ prima del completamento di una chiamata asincrona in sospeso, il metodo Begin_ restituirà RPC_E_CALL_PENDING.

Se il client non necessita dei risultati del metodo Begin_, può rilasciare l'oggetto chiamata alla fine di questa procedura. COM rileva questa condizione e pulisce la chiamata. Il metodo Finish_ non viene chiamato e il client non ottiene parametri out o un valore restituito.

Quando l'oggetto server è pronto per la restituzione dal metodo Begin_, segnala all'oggetto chiamata che viene eseguito. Quando il client è pronto, verifica se l'oggetto chiamata è stato segnalato. In tal caso, il client può completare la chiamata asincrona.

Il meccanismo per questo segnale e il controllo tra client e server è l'interfaccia ISynchronize nell'oggetto chiamata. L'oggetto chiamata implementa in genere questa interfaccia aggregando un oggetto di sincronizzazione fornito dal sistema. L'oggetto di sincronizzazione esegue il wrapping di un handle di eventi, che il server segnala appena prima di tornare dal metodo Begin_ chiamando ISynchronize::Signal.

Per completare una chiamata asincrona

  1. Eseguire una query sull'oggetto chiamata per l'interfaccia ISynchronize .

  2. Chiama ISynchronize::Wait.

  3. Se Wait restituisce RPC_E_TIMEOUT, l'elaborazione del metodo Begin_ non viene completata. Il client può continuare con altre operazioni e chiamare di nuovo Wait in un secondo momento. Non può chiamare il metodo Finish_ finché Wait non restituisce S_OK.

    Se Wait restituisce S_OK, viene restituito il metodo Begin_. Chiamare il metodo Finish_ appropriato.

Il metodo Finish_ passa il client a tutti i parametri out. Il comportamento dei metodi asincroni, incluso il valore restituito del metodo Finish_, deve corrispondere esattamente a quello del metodo sincrono corrispondente.

Il client può rilasciare l'oggetto di chiamata non appena viene restituito il metodo Finish_ oppure può contenere un puntatore all'oggetto chiamata per effettuare chiamate aggiuntive. In entrambi i casi, il client è responsabile del rilascio dell'oggetto chiamata quando l'oggetto non è più necessario.

Se si chiama un metodo Finish_ quando non è in corso alcuna chiamata, il metodo restituirà RPC_E_CALL_COMPLETE.

Nota

Se gli oggetti client e server si trovano nello stesso apartment, non è garantito che le chiamate a ICallFactory::CreateCall abbiano esito positivo. Se l'oggetto server non supporta la chiamata asincrona in una particolare interfaccia, il tentativo di creare un oggetto di chiamata avrà esito negativo e il client deve usare l'interfaccia sincrona.

 

Annullamento di una chiamata asincrona

Sicurezza client durante una chiamata asincrona

Rappresentazione e chiamate asincrone