Perchè il mio NamedPipeServerStream non aspetta?
-
25-09-2019 - |
Domanda
sto lavorando con un NamedPipeServerStream per la comunicazione tra due processi. Ecco il codice dove inizializzo e collegare il tubo:
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)
{
}
Ma non sembra mai aspettare. Ricevo constantemente la seguente eccezione:
System.InvalidOperationException: tubo non è stato ancora collegato. a System.IO.Pipes.PipeStream.CheckWriteOperations () a System.IO.Pipes.PipeStream.WriteByte (valore Byte) a PeachesObjectVisualizer.Visualizer.Show (IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
Vorrei pensare che, dopo l'attesa ritorna tutto dovrebbe essere pronto per andare.
Se uso pipeServer.WaitForConnection () tutto funziona bene, ma appeso la domanda se il tubo non si connette non è un'opzione.
Soluzione
è necessario chiamare EndWaitForConnection .
var asyncResult = pipeServer.BeginWaitForConnection(PipeConnected, this);
if (asyncResult.AsyncWaitHandle.WaitOne(5000))
{
pipeServer.EndWaitForConnection(asyncResult);
// ...
}