管道正在关闭异常

时间:2012-02-07 11:26:32

标签: c# .net pipe

有时,在某些机器上经常使用我的程序并且很少,正在使用我的程序的客户端正在获得“管道正在关闭”的例外情况。这发生在.WaitForConnection()上的NamedPipeServerStream上。之后,应用程序完全崩溃并释放Windows异常。当NamedPipeClientStream将信息传输到独立应用程序时会发生这种情况。

主要的Funktionality: 我写了几个与NamedPipes一起通信的工具(Office工具栏,一个服务,一个独立的.net应用程序和一个litle starter exe)。 该服务运行始终打开的NamedPipeServerStream(状态为.WaitForConnection();),并且独立应用程序也具有NamedPipeServerStream。 工具栏和starter .exe与服务进行通信。然后使用独立应用程序服务。

什么样的问题可以释放管道被关闭异常? 是否有可能服务器向独立应用程序发送信息,但由于独立应用程序尚未就绪或某些原因而将流关闭为早期?在每个NamedPipeClientStream上我执行waitforpipedrain如果pipeClient.IsConnected befor我关闭了pipeclient ..

感谢您的帮助

编辑:这是客户端流的示例

using (NamedPipeClientStream pipeClient =
        new NamedPipeClientStream(".", pipename, PipeDirection.Out))
{
    // Wait for a client to connect
    try
    {                            
        pipeClient.Connect(3000);

        // send params to the form
        using (StreamWriter sw = new StreamWriter(pipeClient))
        {
            sw.AutoFlush = true;
            sw.WriteLine(sendtext);
        }
    }
    // Catch the IOException that is raised if the pipe is
    // broken or disconnected.
    catch (Exception e)
    {
        if (sid != "")
        {
            connections.Remove(conName);
        }
        eventLog1.WriteEntry("SendText Fehler 1 " + e.Message);
    }
    finally
    {
        if (pipeClient.IsConnected)
        {
            pipeClient.WaitForPipeDrain();
        }
        pipeClient.Close();
        pipeClient.Dispose();
    }

pipeserver(在seperad线程中运行)的示例

NamedPipeServerStream pipeServer;
PipeSecurity pipe_security = CreateSystemIoPipeSecurity();
do
    string pipename = global::TOfficeCenter.Properties.Settings.Default.pipename;
    string aText = "";
    pipeServer = new NamedPipeServerStream(pipename, PipeDirection.In, ONE_INSTANCE, PipeTransmissionMode.Byte,
                                    PipeOptions.None, IN_BUF_SIZE, OUT_BUF_SIZE, pipe_security);
    try
    {
        // Verbindung zu TOfficeCenter.exe aufbauen
        try
        {
            IsWaiting = true;
            pipeServer.WaitForConnection();
            IsWaiting = false;

            using (StreamReader sr = new StreamReader(pipeServer))
            {
                string temp;
                while ((temp = sr.ReadLine()) != null)
                {
                    aText = aText + temp;
                }
            }

            try
            {
                if (aText == "")
                {
                    empfang(null);
                }
                else
                {
                    if (aText != "KillPipe")
                    {  // XML empfangen
                        XmlDocumentTC xml = new XmlDocumentTC();
                        xml.LoadXml(aText);
                        empfang(xml);
                    }
                }
            }
            catch (Exception)
            {
                empfang(null);
            }
        }
        catch 
{...........
}       
    }

    catch (Exception e)
    {...........
    }

} while (running);

pipeServer.Close();

2 个答案:

答案 0 :(得分:0)

有可能我终于找到了问题..

我发现在这段代码之后:

                    using (StreamWriter sw = new StreamWriter(pipeClient))
                    {
                        sw.AutoFlush = true;
                        sw.WriteLine(sendtext);
                    }

pipeClient.IsConnected();直接返回false,因此它永远不会出现在WaitForPipeDrain中。我现在这样做,并希望客户端在服务器完成阅读之前不关闭连接..

                    using (StreamWriter sw = new StreamWriter(pipeClient))
                    {
                        sw.AutoFlush = true;
                        sw.WriteLine(sendtext);
                        pipeClient.WaitForPipeDrain();
                    }

您认为可以解决问题吗?自从我这样做以来,我从未在两台测试机器上得到错误。但无论如何,错误很少发生..

答案 1 :(得分:0)

我的使用有点不同,但我会将服务器线程包括在内,因为它目前主要是从MSDN页面被黑客入侵:

http://codeception.com/docs/08-Customization

不确定我是否需要“WaitForPipeToDrain()”,但我从你的代码中取出它:)

我认为每次重置pipeServer都会清除我的IOException。

{{1}}