Llamar a los métodos asíncronos de un servicio WCF

Quiero llamar a los métodos asíncronos de un servicio WCF, algo así como:

[ServiceContract] interface IService { [OperationContract] int SomeMethod(int data); } int SomeMethod(int data) { var query = ... build LINQ query; var response = await query.ToListAsync(); return response.Length; } 

No quiero agregar IService a la interfaz SomeMethod o SomeMethod método SomeMethod . El uso de métodos asíncronos es un problema interno que no debe reflejarse en la interfaz.

¿Cómo puedo hacer eso?

ACLARACIÓN:

Mi problema aquí es usar await en un método no async . No quiero que el contrato de servicio cambie (el cliente no necesariamente sabe qué es async ), y no quiero dividir el método en BeginSomeMethod y EndSomeMethod . Quiero un método que use internamente .

Si el servidor usa sincronización o código asíncrono no es importante para el cliente. El cliente y el servidor están separados por un protocolo de cable bien especificado (a menudo SOAP). SOAP no tiene noción de finalización asincrónica.

Puede tener un servidor de sincronización y un cliente asíncrono, o viceversa. El cliente no puede detectar si el servidor es sincronizado o asíncrono. Este es un detalle de implementación. El servidor podría ser un reloj de pulsera que ejecuta Linux y aún no podrías decirlo.

El estilo de IO que utiliza es un detalle de implementación y no influye en los bytes que pasan por la red.

Así que elige lo que quieras. El cliente puede seguir usando async IO para acceder al servidor.

No estoy seguro de por qué esta es una sorpresa para la gente. En otros contextos, esto parece muy intuitivo: puede tener un servidor TCP asíncrono y un cliente síncrono. Puedo decir un new WebClient().DownloadString(url) y descargar una cadena sincrónicamente desde un servidor web que se implementa de forma asíncrona. Ni siquiera puedo decir qué software de servidor se está ejecutando.

Use Fiddler para ver qué pasa por el cable cuando realiza una llamada WCF. No hay noción de llamadas síncronas o asíncronas.

Debajo del capó, cuando invocas un servicio de forma asíncrona, la biblioteca del cliente WCF usa los sockets TCP de forma asíncrona. Cuando se invoca sincrónicamente, los sockets TCP se usan con llamadas bloqueadas. Esa es toda la diferencia.

Los clientes generados por WCF pueden tener métodos asíncronos además de los métodos síncronos. Seleccione la opción “Generar operaciones asíncronas” en la interfaz de usuario. Ahora tienes ambas versiones. Ambos completamente funcionales.

Aquí le mostramos cómo puede convencerse de esto con un experimento: escriba un servidor de sincronización y llámelo sincrónico y asincrónico desde el mismo cliente .NET. Ahora escriba un segundo servidor de forma asincrónica (en el estilo que desee) y use exactamente el mismo código de cliente para llamarlo.

Task e IAsyncResult no se pueden serializar en SOAP de todos modos, por lo que no es posible que una Task se transmita al cliente.