【问题标题】:C# Keeping Pipes OpenC# 保持管道打开
【发布时间】:2009-11-11 22:34:24
【问题描述】:

我有两个程序(服务器/客户端) 我正在尝试为他们设置 IPC(他们都在同一个盒子上运行) 使用 System.IO.Pipes & Net 3.5

当我调用 ComOpen 时,它会正确打开管道,将进程 ID 发送到服务器,但随后管道关闭,当它尝试发送“第二次写入测试”时出现错误

所以问题是。 如何在程序的生命周期内保持管道打开? (如果客户端崩溃,我使用服务器上的进程 ID 来关闭所有内容)

private static StreamWriter MyWriter;
private static StreamReader MyReader;
private static NamedPipeClientStream IPCPipe = new NamedPipeClientStream(".", "MyPipe", PipeDirection.InOut);


    public static bool MyWrite(string DataOut)
    {
        bool ValidPipeOut = false;
        if(ValidComPort)
        try
        {
            // Send Data
            using (QstWriter = new StreamWriter(IPCPipe))
            {
                QstWriter.AutoFlush = true;
                QstWriter.WriteLine(QstDataOut);
                QstWriter.Close();
                QstWriter.Dispose();
            }
            ValidPipeOut = true;
        }
        catch
        {
            ValidPipeOut = false;
        }
        return ValidPipeOut;
    }


    public static bool ComOpen()
    {
        ValidComPort = true;

        try { IPCPipe.Connect(1000); }
        catch (Exception ex)
        {
            string Erroris;
            Erroris = ex.Message;
            if (Erroris == "Already in a connected state.")
            {
                // We're Already Connected, Ignore this error.
                ValidComPort = true;
            }
            else
            {
                ValidComPort = false;
                MessageBox.Show(Erroris);
            }
        }
        if (ValidComPort)
        {
            string ClientProcessID = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
            MyReader = new StreamReader(IPCPipe);
            ValidComPort = MyWrite(ClientProcessID);
            ValidComPort = MyWrite("Second Write Test");
        }
        return ValidComPort;
    }

【问题讨论】:

  • 谢谢你解决了这个问题。

标签: c# pipe


【解决方案1】:

问题出在下面一行:

using (QstWriter = new StreamWriter(IPCPipe))

在 using 语句结束时,StreamWriter 将被释放,而后者又将释放 IPCPipe。您还在 QstWriter 上显式调用 Dispose 和 Close,这也会关闭管道。

要解决此问题,请删除 using 语句以及对 QstWriter 上的 Dispose 和 Close 的调用。并且只分配+初始化 QstWriter 一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2010-11-24
    • 2018-01-12
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多