【发布时间】:2014-10-21 03:34:08
【问题描述】:
我有两个 Windows 应用程序并使用命名管道在它们之间发送和接收数据列表。 具有使用 BinaryFormatter 类的序列化/反序列化机制。
服务器:
static void StartServer()
{
var server = new NamedPipeServerStream("PipesEnroll", PipeDirection.InOut);
while (true)
{
StreamReader reader = new StreamReader(server);
StreamWriter writer = new StreamWriter(server);
string terminalTemplate;
string matcherTemplate;
int mathVersionNumber = 9;
int numberFingers;
BinaryFormatter formatterDeserialize = new BinaryFormatter();
List<byte[]> retrievedList = (List<byte[]>)formatterDeserialize.Deserialize(reader.BaseStream);
bool isOk = Enroll.EnrollWithoutWCF(retrievedList, mathVersionNumber, out terminalTemplate, out matcherTemplate, out numberFingers);
List<String> sendList = new List<string>();
sendList.Add(isOk.ToString());
sendList.Add(terminalTemplate);
sendList.Add(matcherTemplate);
sendList.Add(numberFingers.ToString());
BinaryFormatter formatterSerialize = new BinaryFormatter();
formatterSerialize.Serialize(writer.BaseStream, sendList);
server.Disconnect();
}
客户:
using (var client = new NamedPipeClientStream(".", "PipesEnroll", PipeDirection.InOut))
{
client.Connect();
StreamReader reader = new StreamReader(client);
StreamWriter writer = new StreamWriter(client);
BinaryFormatter formatterSerialize = new BinaryFormatter();
formatterSerialize.Serialize(writer.BaseStream, images);
// writer.Write(stream);
// writer.Flush();
BinaryFormatter formatterDeserialize = new BinaryFormatter();
List<String> retrievedList = (List<String>)formatterDeserialize.Deserialize(reader.BaseStream);
bool isOK = Convert.ToBoolean(retrievedList[0]);
string terminalTemplate = retrievedList[1];
string matcherTemplate = retrievedList[2];
int numberFingers = Convert.ToInt32(retrievedList[3]);
}
但是执行 formatterSerialize.Serialize(writer.BaseStream, images); 时客户端出现异常“System.IO.Exception: Pipe is broken”处于调试模式。
有人对如何避免这个问题有任何建议吗?
【问题讨论】:
-
我真的不知道问题出在哪里。而且您没有提供可调试的示例,因此无法进行实际调查。但是我确实找到了另一个命名管道的 SO 示例,他们在开始尝试从流中读取之前在服务器中调用了 WaitForConnection()。您可以尝试在此处添加。此外,您应该摆脱 StreamReader 和 StreamWriter 对象。您没有使用它们,尝试将它们与从/到底层流的直接读取/写入混合是一个坏主意。
-
在断开连接之前添加 WaitForPipeDrain()。
-
非常感谢您的回复。确实,我只是忘记了服务器端的 WaitForConnection()。
标签: c# named-pipes inter-process-communicat broken-pipe