Pregunta

Estoy trabajando con un NamedPipeServerStream para la comunicación entre dos procesos. Aquí está el código donde inicialización y conexión de la tubería:

void Foo(IHasData objectProvider)
{
    Stream stream = objectProvider.GetData();
    if (stream.Length > 0)
    {
        using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("VisualizerPipe", PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous))
        {
            string currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string uiFileName = Path.Combine(currentDirectory, "VisualizerUIApplication.exe");
            Process.Start(uiFileName);
            if(pipeServer.BeginWaitForConnection(PipeConnected, this).AsyncWaitHandle.WaitOne(5000))
            {
                while (stream.CanRead)
                {
                    pipeServer.WriteByte((byte)stream.ReadByte());
                }
            }
            else
            {
                throw new TimeoutException("Pipe connection to UI process timed out.");
            }
        }
    }
}

private void PipeConnected(IAsyncResult e)
{
}

Sin embargo, nunca parece esperar. Recibo constantemente la siguiente excepción:

System.InvalidOperationException: Pipe no se ha conectado todavía.    en System.IO.Pipes.PipeStream.CheckWriteOperations ()    en System.IO.Pipes.PipeStream.WriteByte (valor Byte)    en PeachesObjectVisualizer.Visualizer.Show (IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)

Me gustaría pensar que después de que los rendimientos de espera todo debería estar listo para funcionar.

Si utilizo pipeServer.WaitForConnection () todo funciona bien, pero colgar la aplicación si el tubo no se conecta no es una opción.

¿Fue útil?

Solución

Es necesario llamada EndWaitForConnection .

var asyncResult = pipeServer.BeginWaitForConnection(PipeConnected, this);

if (asyncResult.AsyncWaitHandle.WaitOne(5000))
{
    pipeServer.EndWaitForConnection(asyncResult);

    // ...
}

Ver:. IAsyncResult patrón de diseño

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top