C # Держать трубы открытыми - PullRequest
3 голосов
/ 12 ноября 2009

У меня есть две программы (сервер / клиент) Я пытаюсь настроить IPC для них (они оба работают на одной коробке) Использование System.IO.Pipes & Net 3.5

Когда я вызываю ComOpen, он правильно открывает канал, отправляет идентификатор процесса на сервер, но затем канал закрывается, и я получаю сообщение об ошибке при попытке отправить «Второй тест записи»

Так что вопрос. Как мне сохранить Трубу открытой для жизни Программы? (Я использую идентификатор процесса на сервере, чтобы закрыть все в случае сбоя клиента)

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;
    }

1 Ответ

2 голосов
/ 12 ноября 2009

Проблема в следующей строке:

using (QstWriter = new StreamWriter(IPCPipe))

В конце инструкции использования будет ликвидирован StreamWriter, который, в свою очередь, удалит IPCPipe. Вы также явно вызываете Dispose и Close на QstWriter, который также закроет канал.

Чтобы исправить это, удалите оператор using и вызовы Dispose и Close на QstWriter. И назначить + инициализировать QstWriter только один раз.

...