Annullamento di una chiamata asincrona

Un client può annullare una chiamata asincrona in corso se l'oggetto chiamata implementa l'interfaccia ICancelMethodCalls . Per gli oggetti che usano il marshalling standard, ICancelMethodCalls è sempre disponibile per le chiamate di marshalling. Per gli oggetti che utilizzano il marshalling personalizzato o per le chiamate a oggetti server all'interno dello stesso apartment, questa funzionalità è disponibile solo se l'oggetto chiamata implementa ICancelMethodCalls.

Il client può annullare la chiamata in qualsiasi momento, da quando il metodo Begin_ viene chiamato fino a quando non viene restituito il metodo Finish_. Se il client annulla la chiamata prima di chiamare il metodo Finish_, deve chiamare il metodo Finish_ per pulire lo stato dell'oggetto di chiamata. Fino a quando il client non ha eseguito questa operazione, tutte le chiamate a qualsiasi metodo Begin_ sull'oggetto chiamata restituiranno RPC_E_CALL_PENDING.

Per annullare una chiamata asincrona

  1. Eseguire una query sull'oggetto di chiamata per ICancelMethodCalls.

  2. Chiamare ICancelMethodCalls::Cancel e quindi chiamare Release per rilasciare il puntatore ottenuto dalla chiamata QueryInterface nel passaggio 1.

  3. Se il client non ha già chiamato il metodo Finish_, chiamarlo ora.

Non esiste alcuna garanzia che il server abbia effettivamente interrotto l'esecuzione della chiamata. Se il lavoro del client dipende da uno stato del server che la chiamata potrebbe essere stata modificata o meno, il client deve determinare tale stato prima di procedere.

Esecuzione di una chiamata asincrona