2009-12-14 14 views
7

¿Cuál es la diferencia entre el marcado con un método WCF¿Cuál es la diferencia entre [OperationContract (IsOneWay = true)] y la casilla de verificación de operaciones asincrónicas generadas?

[OperationContract(IsOneWay = true)]

atributo y comprobar la casilla generan operaciones asíncronas al agregar una referencia de servicio?

Por lo que he leído, parece que la naturaleza asincrónica de la llamada solo debe definirse en el lado del cliente. Si ese es el caso, ¿cuál es el objetivo del [OperationContract(IsOneWay = true)]?

En este momento, solo tengo el siguiente método ejecutándose en el método WCF.

public void UpdateIndex(IndexElement[] indexElements) 
    { 
     // start the update on a new thread. 
     Thread thread = new Thread(() => UpdateIndexThread(indexElements)); 
     thread.Start(); 
    } 

creé una referencia de servicio en el código de mi cliente, y simplemente me llaman:

indexerClient.UpdateIndex(indexElements); 

Dónde indexerClient es una instancia de mi servicio WCF.

¿Esto también debería funcionar? No parece, es casi como si esperara a que el hilo se completara antes de regresar.

Respuesta

11

Estos son muy diferentes.

En un nivel conceptual, IsOneWay = true dice que el patrón de mensajes es "disparar y olvidar" en contraposición, p. Ej. 'solicitar respuesta'. Es decir, IOW = verdadero significa que hay un mensaje del cliente al servidor, pero no una respuesta del servidor al cliente. Por el contrario, un método que no sea IOW = true normalmente tendrá un mensaje de respuesta, incluso si el tipo de devolución es nulo (por ejemplo, un mensaje 'vacío').

El patrón asíncrono se refiere a cómo se comporta el código del cliente, p. ¿Bloquea esperar el valor de retorno o no? Async es una cosa 'local', vea this blog para más detalles. Puede tener un cliente asíncrono para un servidor de sincronización o un cliente de sincronización para un servidor asíncrono. WCF hará la magia bajo el capó para darte cualquier modelo de programación. Si tiene, por ejemplo, un patrón de mensaje de solicitud-respuesta y el uso de 'generar asincrónico', el cliente generado le dará, por ejemplo, un método que puede llamar asincrónico (por ejemplo, enviar el mensaje y obtener una devolución de llamada cuando llegue la respuesta).

Utilice 'async' para 'modelo de programación local' y use IOW para 'mensajes en el cable'.

Tenga en cuenta que en su ejemplo, si marca el método IOW = verdadero, entonces creo que no hay ningún motivo para Thread.Start() en el código del servidor. Simplemente puede hacer el trabajo allí mismo en el hilo que WCF le ha dado a su servidor.

+0

¡Eso tiene mucho sentido! ¡Muchas gracias, aclara un montón de frustración! – Matt

+0

Solo para aclarar, esto debería leer de esta manera ¿no? Es decir, IOW = verdadero significa que hay un mensaje del cliente al servidor y una respuesta del servidor al cliente. Por el contrario, un método que no sea IOW = true normalmente NO tendrá un mensaje de respuesta, incluso si el tipo de devolución es nulo (por ejemplo, un mensaje 'vacío'). – Matt

+0

Gracias, tenía una oración al revés, solo edité para corregirlo. – Brian

Cuestiones relacionadas