Condividi tramite


Annullamento delle chiamate al metodo

Con l'introduzione di applicazioni distribuite e basate sul Web, alcune chiamate ai metodi possono richiedere tempi di restituzione inaccettabili. La latenza della connessione di rete può essere elevata, il computer server potrebbe servire molti client o il componente server potrebbe passare una grande quantità di dati, ad esempio un file multimediale. Gli utenti devono essere in grado di annullare una richiesta che richiede troppo tempo e l'applicazione deve essere in grado di gestire le richieste di annullamento e continuare con l'altro lavoro. In COM è possibile usare l'interfaccia IMessageFilter per annullare una chiamata in sospeso originata da un apartment a thread singolo.

Quando viene eseguito il marshalling di una chiamata, il proxy crea un oggetto cancel, che implementa l'interfaccia ICancelMethodCalls . L'oggetto cancel è associato sia alla chiamata che al thread in cui la chiamata è in sospeso.

Per annullare la chiamata in sospeso, il client passa una richiesta di annullamento tramite l'oggetto cancel, che gestisce i dettagli della notifica all'oggetto server che la chiamata è stata annullata. Se il metodo chiamato non è stato restituito, l'oggetto server, nel rilevare la richiesta di annullamento, pulisce tutte le risorse del programma allocate e ne notifica il client, restituendo un valore HRESULT appropriato, che ha annullato l'esecuzione della chiamata. Se il metodo chiamato è già stato restituito, l'oggetto cancel invia una notifica al client. In entrambi i casi, il thread client viene sbloccato e può continuare l'elaborazione.

Il modo in cui l'oggetto server risponde a una richiesta di annullamento è a discrezione dell'implementatore del server, ma il thread chiamante nel client verrà sempre sbloccato e ignorerà i risultati che il server tenta di passarvi. Gli oggetti Cancel forniscono un mezzo per richiedere l'annullamento di un metodo attualmente in esecuzione, ma non esiste alcuna garanzia che l'oggetto server arresti l'elaborazione della chiamata. Ad esempio, la chiamata potrebbe essere già stata restituita oppure l'oggetto server potrebbe non supportare gli oggetti cancel.

COM fornisce automaticamente un'implementazione standard di oggetti cancel per oggetti client e interfacce che usano il marshalling standard. Per gli oggetti e le interfacce che usano il marshalling personalizzato, è necessario implementare il proprio oggetto cancel.

A questo punto, gli oggetti annullano gestiscono solo chiamate sincrone.

Annullamento di una chiamata asincrona

CoGetCancelObject

CoSetCancelObject

CoTestCancel