System.IO.Exception:管道已损坏

时间:2009-05-21 22:03:30

标签: c# .net-3.5 named-pipes

我有两个.NET应用程序通过命名管道相互通信。第一次发送时,一切都很棒,但是在发送第一条消息后,服务器将再次收听,WaitForConnection()方法会抛出System.IO.Exception消息管道已损坏。
为什么我在这里得到这个例外?这是我第一次使用管道,但过去使用套接字时,类似的模式对我有用。

代码啊!
服务器:

using System.IO.Pipes;

static void main()
{
    var pipe = new NamedPipeServerStream("pipename", PipeDirection.In);
    while (true)
    {
        pipe.Listen();
        string str = new StreamReader(pipe).ReadToEnd();
        Console.Write("{0}", str);
    }
}

客户端:

public void sendDownPipe(string str)
{
    using (var pipe = new NamedPipeClientStream(".", "pipename", PipeDirection.Out))
    {
        using (var stream = new StreamWriter(pipe))
        {
            stream.Write(str);
        }
    }
}

对sendDownPipe的第一次调用让服务器打印我发送的消息就好了,但是当它再次循环再次监听时,它就会大便。

3 个答案:

答案 0 :(得分:19)

我会发布似乎有效的代码 - 我很好奇,因为我从未对管道做过任何事情。我没有在相关命名空间中找到您为服务器端命名的类,因此这里是基于 NamedPipeServerStream 的代码。回调的原因只是因为我不能为两个项目烦恼。

NamedPipeServerStream s = new NamedPipeServerStream("p", PipeDirection.In);
Action<NamedPipeServerStream> a = callBack;
a.BeginInvoke(s, ar => { }, null);
...
private void callBack(NamedPipeServerStream pipe)
{
  while (true)
  {
    pipe.WaitForConnection();
    StreamReader sr = new StreamReader(pipe);
    Console.WriteLine(sr.ReadToEnd());
    pipe.Disconnect();
  }
}

客户这样做:

using (var pipe = new NamedPipeClientStream(".", "p", PipeDirection.Out))
using (var stream = new StreamWriter(pipe))
{
  pipe.Connect();
  stream.Write("Hello");
}

我可以在服务器运行时多次重复上面的阻止,没有概率。

答案 1 :(得分:8)

当我在客户端断开连接后从服务器调用pipe.WaitForConnection()时,发生了问题。解决方案是捕获IOException并调用pipe.Disconnect(),然后再次调用pipe.WaitForConnection():

while (true)
{
    try
    {
        _pipeServer.WaitForConnection();
        break;
    }
    catch (IOException)
    {
        _pipeServer.Disconnect();
        continue;
    }            
 }

答案 2 :(得分:0)

我也遇到了同样的问题-这是由于使用... End Using处置服务器的StreamReader引起的,该事件还会删除NamedPipeServerStream。解决方案是根本不使用...结束使用它并信任垃圾收集器。