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.

È stato utile?

Soluzione

è necessario chiamare EndWaitForConnection .

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

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

    // ...
}

vedi:. IAsyncResult modello di progettazione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top