¿Por qué no espera a mi NamedPipeServerStream?
-
25-09-2019 - |
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.
Solución
Es necesario llamada EndWaitForConnection .
var asyncResult = pipeServer.BeginWaitForConnection(PipeConnected, this);
if (asyncResult.AsyncWaitHandle.WaitOne(5000))
{
pipeServer.EndWaitForConnection(asyncResult);
// ...
}