Frage

Ich arbeite mit einem NamedPipeServerStream zwischen zwei Prozessen zu kommunizieren. Hier ist der Code, wo ich initialisieren und schließen Sie das Rohr:

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)
{
}

Aber es scheint nie zu warten. Ich ständig die folgende Ausnahme erhalten:

System.InvalidOperationException: Rohr hat noch nicht angeschlossen.    bei System.IO.Pipes.PipeStream.CheckWriteOperations ()    bei System.IO.Pipes.PipeStream.WriteByte (Byte-Wert)    bei PeachesObjectVisualizer.Visualizer.Show (IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)

Ich würde denken, dass, nachdem die Wartezeit kehrt alles bereit sein sollte, zu gehen.

Wenn ich pipeServer.WaitForConnection () verwenden, funktioniert alles einwandfrei, aber die Anwendung hängen, wenn das Rohr nicht connect tut, ist keine Option.

War es hilfreich?

Lösung

Sie müssen Anruf EndWaitForConnection .

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

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

    // ...
}

Siehe auch:. IAsyncResult Entwurfsmuster

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top