Procedura: chiamare operazioni del servizio WCF in modo asincrono
In questo argomento viene illustrato come un client può accedere a un'operazione del servizio in modo asincrono. Il servizio in questo argomento implementa l'interfaccia ICalculator
. Il client può chiamare le operazioni in questa interfaccia in modo asincrono utilizzando il modello di chiamata asincrono basato su eventi. (Per ulteriori informazioni sul modello di chiamata asincrono basato su eventi, vedere Multithreaded Programming with the Event-based Asynchronous Pattern). Per un esempio che illustra come implementare in modo asincrono un'operazione in un servizio, vedere Procedura: implementare un'operazione del servizio asincrona. Per ulteriori informazioni sulle operazioni sincrone e asincrone, vedere Operazioni sincrone e asincrone.
Nota
Il modello di chiamata asincrono basato su eventi non è supportato quando si utilizza una classe ChannelFactory. Per ulteriori informazioni sulle chiamate asincrone utilizzando la classe ChannelFactory, vedere Procedura: chiamare le operazioni in modo asincrono tramite una channel factory.
Procedura
Per chiamare operazioni del servizio WCF in modo asincrono
Eseguire lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) con entrambe le opzioni di comando /async e /tcv:Version35 come illustrato nel comando seguente.
svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8000/servicemodelsamples/service/mex /a /tcv:Version35
Questa operazione genera, oltre alle operazioni sincrone e a quelle asincrone standard basate su delega, una classe client WCFcontenente:
- Due operazioni <operationName>Async da utilizzare con l’approccio di chiamata asincrono basato su eventi. Ad esempio:
- Eventi completati dall'operazione del modulo <operationName>Completed da utilizzare con l’approccio di chiamata asincrono basato su eventi. Ad esempio:
- Tipi System.EventArgs per ciascuna operazione (del modulo <operationName>CompletedEventArgs) da utilizzare con l’approccio di chiamata asincrono basato su eventi. Ad esempio:
Nell'applicazione chiamante creare un metodo di callback da chiamare al temine dell'operazione asincrona, come illustrato nel codice di esempio seguente.
Prima di chiamare l'operazione utilizzare un nuovo metodo System.EventHandler generico di tipo <operationName>EventArgs per aggiungere il metodo del gestore eventi (creato nel passaggio precedente) all'evento <operationName>Completed. Quindi chiamare il metodo <operationName>Async. Ad esempio:
Esempio
Nota
Le linee guida di progettazione per il modello asincrono basato su eventi indicano che, se vengono restituiti più valori, un valore viene restituito come proprietà Result e i restanti valori sono restituiti come proprietà nell’oggetto EventArgs. Di conseguenza, è possibile che, se un client importa metadati utilizzando le opzioni di comando asincrone basate su eventi e l'operazione restituisce più valori, l'oggetto predefinito EventArgs restituisce un valore come proprietà Result e i restanti valori come proprietà dell’oggetto EventArgs. Se si desidera ricevere l’oggetto del messaggio come proprietà Result e i valori restituiti come proprietà in quell’oggetto, utilizzare l’opzione di comando /messageContract. Questa operazione genera una firma che restituisce il messaggio di risposta come proprietà Result nell’oggetto EventArgs. Pertanto, tutti i valori restituiti interni sono proprietà dell’oggetto del messaggio di risposta.