2010-03-01 9 views
5

He buscado por toda la web, pero no puedo encontrar la respuesta a la siguiente pregunta.Cancelar NamedPipeClientStream.Llamada de llamada

Tengo una instancia de C#/.NET NamedPipeClientStream en un programa cliente, y un hilo de trabajo está llamando a NamedPipeClientStream.Read (byte [], int, int) para obtener datos de un servidor. El servidor envía actualizaciones de datos al cliente.

Leer es una llamada de bloqueo. Si quiero cerrar el cliente, ¿hay alguna forma de cancelar/salir de la llamada de lectura? Intenté llamar a Cerrar en la instancia de canalización con nombre, pero no tiene efecto en el hilo que llamó a Leer.

Creo que habría una forma de cancelar una llamada de Lectura. Si no, parece que es una API muy mal diseñada, porque su programa está a merced de la tubería.

Cualquier información es muy apreciada.

-Chris

Respuesta

7

Utilice el constructor NamedPipeClientStream que toma un argumento PipeOptions. Especificar PipeOptions.Asynchronous completará la llamada de Lectura() cuando llame al método Close(). El método Read() devuelve 0.

+0

: D ¡Eres mi héroe! Configurar el conducto para que sea asíncrono hace que una llamada bloqueada a Lectura regrese cuando se llama al Cerrar. ¡Muchas gracias! – Chris

0

No es una respuesta directa a su pregunta, pero - que tenía que hacer alguna NamedPipe IPC hace poco y me encontré con que WCF fue impresionante. Me llevó menos de una hora implementar un POC y sí, estoy bastante seguro de que expone los medios para cancelar tu solicitud, y no tienes que pensar en términos de matrices de bytes.

¿Es esa una opción para usted?

+1

Miré un poco a WCF y me emocioné mucho, pero desafortunadamente el cliente que estoy desarrollando tiene que hablar con un servidor personalizado (C++, no .NET) con su propio tubos con nombre predefinidos y protocolo de comunicación. Cuando estaba mirando a WCF, rápidamente me sentí abrumado por la inmensidad de la documentación. No pude determinar rápidamente si podría usar WCF para hablar con un sistema existente que utiliza canalizaciones con nombre con un protocolo personalizado. Si alguien sabe si esto es posible y puede orientarme en la dirección correcta, lo agradecería enormemente. – Chris