命名管道挂在读

时间:2015-08-30 14:48:32

标签: .net named-pipes

我有一个名称管道服务器。客户端发送消息,看起来没问题,但服务器只挂在行var stringData = textReader.ReadToEnd();上。

var namedPipeServerStream = new NamedPipeServerStream(_pipeName,
                        PipeDirection.In,
                        1,
                        PipeTransmissionMode.Byte,
                        PipeOptions.Asynchronous);

namedPipeServerStream.WaitForConnection();

using (var textReader = new StreamReader(namedPipeServerStream))
{
    var stringData = textReader.ReadToEnd();

    _callback(stringData);

    namedPipeServerStream.Flush();
    namedPipeServerStream.Close();
}

Thread.Sleep(1);

客户端看起来像这样:

public void Send(string message)
{
    var pipeStream = new NamedPipeClientStream(_serverName,
        _pipeName,
        PipeDirection.Out,
        PipeOptions.Asynchronous);

    pipeStream.Connect(_timeout);

    var buffer = UTF8.GetBytes(message);

    pipeStream.Write(buffer, 0, buffer.Length);
}

为什么要挂?

2 个答案:

答案 0 :(得分:3)

NamedPipe流,就像网络流一样,没有明确的结束,它们只是暂时“干涸”,这就是为什么ReadToEnd无限期地试图读取​​更多数据的原因。

但是,您可以将服务器端的PipeTransmissionMode更改为Message,以便将对管道的每次写入视为单独的消息,然后从流中读取,直到{{1 }}返回IsMessageComplete。 e.g:

true

答案 1 :(得分:0)

我遇到了同样的问题,我在 WRITE 端用刷新修复了它。

流写入后立即在客户端刷新管道,以便服务器端可以获取消息。