Проблема скорости окна трубы
У меня есть приложение, которое опрашивает данные каждые 20 мс, обрабатывает их и создает отдельные сообщения, а затем каждое сообщение отправляется одно за другим в другое приложение через канал.
Теперь, когда у меня есть много данных, отправка данных в трубу занимает много времени, потому что для каждого сообщения, отправленного в трубу, соединение трубы открывается, а затем закрывается. Используя секундомер, я обнаружил, что обработка данных сама по себе занимает меньше миллисекунды, но когда данные передаются по трубе, время может занимать от 2 до 13 миллисекунд. Ниже приведена функция отправки:
public bool Send(byte[] SendStr, string PipeName, int TimeOut) { bool status = false; try { NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", PipeName, PipeDirection.Out, PipeOptions.Asynchronous); // The connect function will indefinitely wait for the pipe to become available // If that is not acceptable specify a maximum waiting time (in ms) pipeStream.Connect(TimeOut); Debug.WriteLine("[Client] Pipe connection established"); message = "Pipe connection established"; status = true; pipeStream.BeginWrite(SendStr, 0, SendStr.Length, AsyncSend, pipeStream); } catch (TimeoutException oEX) { Debug.WriteLine(oEX.Message); message = "Pipe connection Error: " + oEX.Message; } return status; } private void AsyncSend(IAsyncResult iar) { try { // Get the pipe NamedPipeClientStream pipeStream = (NamedPipeClientStream)iar.AsyncState; // End the write pipeStream.EndWrite(iar); pipeStream.Flush(); pipeStream.Close(); pipeStream.Dispose(); } catch (Exception oEX) { Debug.WriteLine(oEX.Message); message = "Pipe Error: " + oEX.Message; } }
Я могу ускорить это, просто объединив все сообщения данных вместе и сделав одну отправку, то есть только одну отправку трубы во время обработки, а не несколько отправок трубы.
Это решает мою проблему выбора времени.
Но можно ли открыть соединение с трубой в начале программы, а затем отправлять сообщения данных всякий раз, когда я хочу, чтобы труба была закрыта при выходе из программы ( аналогично записи в файл)? Я пытался сделать это, но получаю ошибки, такие как труба не открывается, когда я пытаюсь отправить второе сообщение.
Или необходимо открывать/закрывать соединение трубы при каждой записи?
Что я уже пробовал:
Я искал в интернете и не нашел ничего подходящего. Если есть возможность открыть трубное соединение и отправить несколько сообщений перед закрытием трубного соединения, то ссылка или пример того, как это сделать, будут оценены по достоинству.
т. е. нужно ли открывать/закрывать соединение каждый раз, когда отправляются данные? Или я могу держать его открытым, пока программа не закончится?
Mehdi Gholam
Постарайтесь не закрывать поток после отправки.