Asincrónico
El ejemplo asincrónico muestra cómo un cliente puede tener acceso de forma asincrónica a una operación del servicio y cómo un servicio puede implementar de forma asincrónica sus operaciones. Este ejemplo se basa en Ejemplo de introducción que implementa un servicio de calculadora. Utilizar una invocación sincrónica o asincrónica es una decisión local y no impacta en los mensajes enviados en la conexión. Aunque el servicio implementa algunas operaciones sincrónicas, el cliente puede tener acceso de forma asincrónica a las operaciones del servicio. Aunque el cliente llama sincrónicamente al servicio, el servicio puede implementar de forma asincrónica algunas operaciones.
Nota: |
---|
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema. |
En este ejemplo, el cliente es una aplicación de consola (.exe) y el servicio se hospeda a sí mismo en una aplicación de consola (.exe).
El servicio implementa la interfaz ICalculator
. El cliente puede llamar a las operaciones en esta interfaz de forma asincrónica, lo que significa que las operaciones como Add
tienen ahora BeginAdd
y EndAdd
.
Nota: |
---|
Consulte la documentación de .NET Framework para obtener más detalles del modelo asincrónico. |
El cliente ha generado un código que admite estas operaciones asincrónicas. El cliente se creó ejecutando la herramienta Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) con la opción de comando /a (async)
, como sigue:
svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8000/servicemodelsamples/service/mex /a /tcv:Version35
La versión asincrónica del cliente del contrato de servicio para la operación Add
aparece de manera similar al código de muestra siguiente.
[System.ServiceModel.ServiceContractAttribute(Namespace=
"http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[System.ServiceModel.OperationContractAttribute(
AsyncPattern=true)]
System.IAsyncResult BeginAdd(double n1, double n2,
System.AsyncCallback callback, object asyncState);
double EndAdd(System.IAsyncResult result);
...
}
Cuando se especifica la opción /tcv:Version35
junto con la opción /async
, el tipo de cliente generado implementa el modelo asincrónico basado en evento para llamar al servicio. Para más información, vea Información general de Modelo asincrónico basado en el evento. Para tener acceso de forma asincrónica a una operación del servicio, la aplicación agrega un controlador de eventos al evento [Operation]Completed
en el cliente y, a continuación, llama al método [Operation]Async
(por ejemplo, AddAsync
) como se muestra en el siguiente código de ejemplo.
// Create a client.
CalculatorClient client = new CalculatorClient();
// BeginAdd.
double value1 = 100.00D;
double value2 = 15.99D;
client.AddCompleted += new EventHandler<AddCompletedEventArgs>(AddCallback);
client.AddAsync(value1, value2);
En el ejemplo, el cliente inicia de forma asincrónica dos operaciones: Add
y Subtract
.
Cuando la función de devolución de llamada se ejecuta, el cliente tiene acceso a la propiedad Result
en el parámetro de entrada [Operation]CompletedEventArgs
para recuperar el resultado.
static void AddCallback(object sender, AddCompletedEventArgs e)
{
Console.WriteLine("Add Result: {0}", e.Result);
}
Todo comportamiento asincrónico es local al cliente y no tiene que ver con la forma en que los mensajes se envían del cliente o cómo el servicio los procesa. La razón típica para utilizar este modelo en una aplicación de interfaz de usuario (UI) es mantener gratuitamente el subproceso de la Interfaz de usuario para actualizar la pantalla. Este modelo también es aplicable cuando un servicio está actuando como un cliente y desea liberar al subproceso del procesamiento de mensajes de las llamadas a otros servicios. La sección siguiente muestra cómo realizar las operaciones del servicio asincrónicas.
El servicio implementa la interfaz ICalculator
como se muestra en el código siguiente.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginMultiply(double n1, double n2,
AsyncCallback callback, object state);
double EndMultiply(IAsyncResult ar);
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginDivide(double n1, double n2,
AsyncCallback callback, object state);
double EndDivide(IAsyncResult ar);
}
Las dos primeras operaciones del contrato se invocan sincrónicamente en el tiempo de ejecución Windows Communication Foundation (WCF). Los últimos dos pares de operaciones se usan para invocar de forma asincrónica el servicio. Esta muestra establece la propiedad AsyncPattern en true. Este valor de la propiedad, en combinación con la implementación del modelo asincrónico .NET Framework, indica al tiempo de ejecución para invocar la operación de forma asincrónica.
La razón para utilizar este modelo en una implementación del servicio es porque normalmente se utiliza para liberar los subprocesos de procesamiento de mensajes al realizar las operaciones de entrada y salida, las cuales exigen mucho tiempo, como si se tuviera acceso al disco, a una base de datos o como si se llamara a otro servicio. Este ejemplo muestra cómo ajustar las operaciones de entrada y salida de archivo con una implementación de IAsyncResult. La clase base para la implementación de la clase MathAsyncResult
se puede reutilizar para escribir sus propias implementaciones de IAsyncResult
.
Nota: |
---|
Esta muestra se utiliza PerCall y Multiple para evitar el comportamiento de la clasificación que viene con un enlace con canal. WsHttpBinding utiliza de forma predeterminada una sesión para establecer el contexto de seguridad. Esto no afecta a la naturaleza asincrónica del procesamiento de mensajes en el cliente o en el servicio, pero da énfasis al control de tiempo de respuestas y permite al cliente observar las devoluciones de llamada simultáneamente, en lugar de en serie. |
Al ejecutar el ejemplo, las solicitudes y respuestas de la operación se muestran en la ventana de la consola del cliente. Las solicitudes Subtract
y Add
no se bloquean porque se invocan de forma asincrónica. A continuación, las operaciones Divide
y Multiply
se bloquean y se muestran sus resultados al mismo tiempo que las solicitudes salen. Finalmente, se muestran los resultados de las operaciones Subtract
y Add
cuando estos resultados llegan de nuevo al cliente. sleep
se utiliza en la implementación del servicio de Add
y Subtract
para mostrar las devoluciones de llamada asincrónicas en el cliente.
Add(100,15.99)
Subtract(145,76.54)
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Add Result: 115.99
Subtract Result: 68.46
Los ids del subproceso se utilizan en el servicio para mostrar que las llamadas sincrónicas, como Add
y Subtract
, se administran en un subproceso único. Las llamadas asincrónicas, como Multiply
y Divide
, implican más de un subproceso. El servicio generado se parece a lo siguiente.
Received Add Synchronously on ThreadID 11: Sleeping for 3 seconds
Asynchronous call: BeginMultiply on ThreadID 12
Received Subtract Synchronously on ThreadID 12: Sleeping for 3 seconds
IO thread for * operation on ThreadID 13
EndMultiply called on ThreadID 14
Asynchronous call: BeginDivide on ThreadID 14
IO thread for / operation on ThreadID 13
EndDivide called on ThreadID 14
Returning Add Result on ThreadID 11
Returning Subtract Result on ThreadID 12
El Modelo asincrónico de .NET Framework se puede utilizar en el cliente, en el servicio, o en ambos. Cuando muestra este ejemplo, los dos lados son independientes.
Para configurar, compilar y ejecutar el ejemplo
Asegúrese de realizar los Procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Compilación de los ejemplos de Windows Communication Foundation.
Para ejecutar el ejemplo en una configuración con un único equipo o con varios, siga las instrucciones de Running the Windows Communication Foundation Samples.
Nota: |
---|
Puede que los ejemplos ya estén instalados en su equipo. Compruebe el siguiente directorio (valor predeterminado) antes de continuar.
<InstallDrive>:\WF_WCF_Samples
Si no existe este directorio, vaya a la página de ejemplos de Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) Samples para .NET Framework 4 para descargar todos los ejemplos de WF y Windows Communication Foundation (WCF). Este ejemplo se encuentra en el siguiente directorio.
<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Contract\Service\Asynchronous
|