R Read Ответов: 0

Проблема скорости окна трубы


У меня есть приложение, которое опрашивает данные каждые 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

Постарайтесь не закрывать поток после отправки.

0 Ответов