C# System.IO.Exception:客户端的管道断开

C# System.IO.Exception:客户端的管道断开,c#,named-pipes,inter-process-communicat,broken-pipe,C#,Named Pipes,Inter Process Communicat,Broken Pipe,我有两个windows应用程序,使用命名管道在它们之间发送和接收数据列表。 具有使用BinaryFormatter类的序列化/反序列化机制 服务器: static void StartServer() { var server = new NamedPipeServerStream("PipesEnroll", PipeDirection.InOut); while (true) { S

我有两个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();
       }
static void StartServer()
{
var server=newnamedpipeserverstream(“PipesEnroll”,PipeDirection.InOut);
while(true)
{
StreamReader=新的StreamReader(服务器);
StreamWriter writer=新的StreamWriter(服务器);
字符串终端模板;
字符串匹配模板;
int mathVersionNumber=9;
整数符号;
BinaryFormatter Formatter反序列化=新的BinaryFormatter();
List retrievedList=(List)formatterDeserialize.Deserialize(reader.BaseStream);
bool isOk=Enroll.EnrollWithout cf(检索列表、数学版本号、out terminalTemplate、out matcherTemplate、out numberFingers);
List sendList=新列表();
Add(isOk.ToString());
sendList.Add(terminalTemplate);
添加(matcherTemplate);
Add(numberFingers.ToString());
BinaryFormatter formatterSerialize=新的BinaryFormatter();
序列化(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]);
使用(var client=newnamedpipeclientstream(“.”,“PipesEnroll”,PipeDirection.InOut))
{
client.Connect();
StreamReader=新的StreamReader(客户端);
StreamWriter writer=新的StreamWriter(客户端);
BinaryFormatter formatterSerialize=新的BinaryFormatter();
序列化(writer.BaseStream,图像);
//writer.Write(流);
//writer.Flush();
BinaryFormatter Formatter反序列化=新的BinaryFormatter();
List retrievedList=(List)formatterDeserialize.Deserialize(reader.BaseStream);
bool isOK=Convert.ToBoolean(retrievedList[0]);
字符串terminalTemplate=retrievedList[1];
字符串matcherTemplate=retrievedList[2];
int numberFingers=Convert.ToInt32(retrievedList[3]);
}

但在调试模式下执行formatterSerialize.Serialize(writer.BaseStream,images)时,客户端会出现异常“System.IO.exception:管道断开”


有人对如何避免此问题有任何建议吗?

StreamWriter属于NamedPipeClientStream。如果处理NamedPipeClientStream,则其进程的一部分也将处理StreamWriter。如果出于任何原因,StreamWriter在代码的任何其他部分关闭/处理,则结果将是管道断开

1) 检查formatterSerialize.Serialize是否未关闭StreamWriter


2) 另外,请确保在退出使用NamedPipeClientStream之前刷新StreamWriter。

我不知道问题出在哪里。而且您没有提供可调试的示例,因此无法进行实际调查。但我确实找到了另一个命名管道的示例,它们称为WaitForConnection()在他们开始尝试从流中读取之前,在服务器中。您可以尝试在此处添加。此外,您应该删除StreamReader和StreamWriter对象。您没有使用它们,尝试将它们与从/到基础流的直接读取/写入混合是一个坏主意。添加WaitForPipeDrain()在您断开连接之前。非常感谢您的回复。事实上,我只是忘记了WaitForConnection()在服务器端。在你回答一个还没有答案的老问题之前,你还应该检查一下评论,看看这里是否提到了问题的解决方案,同时问题也得到了解决。我不同意——很多。虽然这两个建议都是好的,而且最终所做的假设是正确的——但它并不能构成一个简洁的c像这个一样完成一个答案。另外,答案首先不属于评论。