Флаг IsMessageComplete вызывает ошибку в клиенте

233
03 мая 2018, 06:57

Я пишу эту программу на C# с использованием .NET Framework 4.7.1 (последняя на момент написания вопроса). На стороне с NamedPipeServerStream всё в порядке, работает так, как надо. У вот у клиентов чтение/запись работают, но не работает флаг IsMessageComplete. Получаю: "Исключение Возникло исключение "System.InvalidOperationException" в System.Core.dll ("ReadMode не принадлежит к PipeTransmissionMode.Message.")". Я пробовал клиенту давать флаг "PipeTransmissionMode.Message", но он ругается "Дескриптор канала не задан. Совершила ли реализация PipeStream вызов InitializeHandle?", а этой функции даже нет в классе PipeStream + неужели клиенту для работы надо передавать дескриптор сервера (он не передаётся сам?)? Ещё один pipe делать что ли?

Код объявления сервера:
NamedPipeServerStream npserver = new NamedPipeServerStream("pipe1", PipeDirection.InOut, 5, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 128, 128);
Код объявления клиента:
NamedPipeClientStream plc = new NamedPipeClientStream(".", "pipe1", PipeDirection.InOut, PipeOptions.Asynchronous);
Вот класс работы с клиентом (код работы с сервером такой же, но заменены NamedPipeClientStream на NamedPipeServerStream):

class StreamOperations
    {
        public StreamOperations(ref NamedPipeClientStream server)
        {
            this.server = server;
        }
        byte[] buffer1 = new byte[128];
        byte count;
        string str;
        volatile NamedPipeClientStream server;
        public byte RQ1_Read()
        {
            count = (byte)server.Read(buffer1, 0, buffer1.Length);
            str = Encoding.ASCII.GetString(buffer1, 0, count);
            return count;
        }
        public byte RQ1_ReadBig()
        {
            byte[] str = new byte[0];
            count = (byte)server.Read(buffer1, 0, buffer1.Length);
            str = str.Concat(buffer1.Take(count)).ToArray();
            while (!server.IsMessageComplete) //Тут в клиенте возникает ошибка
            {
                count = (byte)server.Read(buffer1, 0, buffer1.Length);
                str = str.Concat(buffer1.Take(count)).ToArray();
            }
            this.str = Encoding.ASCII.GetString(str, 0, str.Length);
            return (byte)(count == 0 ? 0 : 1);
        }
        public string RQ2_KString()
        {
            return str;
        }
        public void Write(string str)
        {
            server.Write(Encoding.ASCII.GetBytes(str), 0, str.Length);
        }
    }
Answer 1

Обратившись к форуму, нашёл ответ на свой вопрос!

А Ларчик просто открывался.

Нужно было прописать plc.ReadMode = PipeTransmissionMode.Message; после plc.Connect(1000);.
Вот и всё!

READ ALSO
asp core изменить путь в Action

asp core изменить путь в Action

Есть action Details(int?id

223
Регулярные выражения C# числа

Регулярные выражения C# числа

Условие задачи почти полностью выполнено, застрял на моменте когда нужно вывесли кол-во нулей из всех вводимых чисел, не понимаю синтаксиса...

263
Как эмулировать нажатие на кнопку в приложении WPF C#

Как эмулировать нажатие на кнопку в приложении WPF C#

Подскажите, как в приложении WPF эмулировать программно нажатие на кнопку Button левой клавишей мыши? Использовать button1PerformClick() не предлагать,...

188
SaveChanges() как работает?

SaveChanges() как работает?

При использовании на контексте SaveChanges() или SaveChangesAsync() после добавления какого-то элемента в экземпляр контекста изменения сохраняются только...

213