我有一个名称管道服务器。客户端发送消息,看起来没问题,但服务器只挂在行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);
}
为什么要挂?
答案 0 :(得分:3)
NamedPipe流,就像网络流一样,没有明确的结束,它们只是暂时“干涸”,这就是为什么ReadToEnd
无限期地试图读取更多数据的原因。
但是,您可以将服务器端的PipeTransmissionMode
更改为Message
,以便将对管道的每次写入视为单独的消息,然后从流中读取,直到{{1 }}返回IsMessageComplete
。 e.g:
true
答案 1 :(得分:0)
我遇到了同样的问题,我在 WRITE 端用刷新修复了它。
流写入后立即在客户端刷新管道,以便服务器端可以获取消息。