Invocare servizi in asincrono con WCF

di Cristian Civera, in Windows Communication Foundation,

Per sviluppare e interrogare servizi, dal .NET Framework 3.0 si ha a disposizione Windows Communication Foundation, un framework completo ed estendibile in tutte le sue parti. Se si vuole interrogare un servizio, anche non necessariamente sviluppato con questa tecnologia (Java, PHP, ecc) è possibile sempre utilizzare WCF il quale aderisce alle specifiche basic profile. In genere si procede con Visual Studio attraverso la voce "Add service reference" (da non confondere con "Add web reference") o attraverso il tool svcutil.exe i quali, in base al WSDL o ad assembly .NET di riferimento, permettono di creare classi proxy per invocare facilmente il servizio remoto con metodi aventi lo stesso nome del nome dell'operazione.

Tali metodi sono sincroni, cioè bloccano il chiamante in attesa di avere una risposta o un possibile errore. Questo il molti casi non è il comportamento che si desidera dato che soprattutto in applicazioni client, questi metodi bloccano anche l'interfaccia grafica.

E' possibile ovviare a questa problematica chiedendo ai tool di generazione di creare anche metodi asincroni i quali sfruttano le funzionalità automatiche di WCF basate sul thread pool per chiamare il servizio. In Visual Studio basta entrare nelle configurazioni avanzate della referenza e scegliere la voce "Generate asyncronous operations" come visibile in figura. Con svcutil.exe basta invece specificare l'opzione /async.

Ciò che si ottiene sono dei metodi di nome Begin*** e End*** che come di consuetudine del .NET Framework permettono di invocare il servizio:

static void Main(string[] args)
{
  MyServiceClient client = new MyServiceClient();
  client.BeginGetData(10, OnGetData, client);
}

private void OnGetData(IAsyncResult ar)
{
  String r = ((MyServiceClient)ar.AsyncState).EndGetData(ar);
}

Oltre a questi metodi vengono creati anche quelli di nome ***Async per invocare in asincrono il servizio in modo simile a Begin/end, ma ottenendo un evento sul thread principale quando la chiamata termina.

static void Main(string[] args)
{
  MyServiceClient client = new MyServiceClient();
  client.GetDataCompleted += client_GetDataComplete;
  client.GetDataAsync(10);
}

static void client_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
  if (e.Exception != null)
    string r = e.Result;
}

Dall'evento si può ottenere con l'argomento il risultato o l'eccezione generata dalla chiamata.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi