Проблемы производительности именованных каналов

Я использую именованные каналы для межпроцедурного взаимодействия между C # и Delphi. C # используетSystem.IO.Pipes пакет, тогда как Delphi используетLibby's pipes.pas, К сожалению, коммуникация почти высокопроизводительна: профилирование показало мне, что коммуникация занимает 72% всей среды выполнения, остальное используется вычислениями.
Мне удалось обнаружить одну проблему, которая может занимать ресурсы: если я не отключу явно соединение отправляющего клиента в Delphi,C # вообще не получает никаких данных.

Delphi (отправка)
FClient1.Write(msg[1], Length(msg));
FClient1.FlushPipeBuffers;
FClient1.WaitForReply(20);
FClient1.Disconnect;   // disconnect to signalize C# that the writing is finished
FClient1.Connect;      // connect again to prevent synchronization problems
C # (получение)
// Wait for a client to connect
stc.pipeServer.WaitForConnection();
while (reconnect_attempts < MAX_RECONNECT_ATTEMPTS) // 
{
   string tmp = sr.ReadLine();

   // if result is empty, try again for <MAX_RECONNECT_ATTEMPTS> times
   // so you can eliminate the chance that there's just a single empty request
   while (tmp != null)// && result != tmp)
   {
      tmp = sr.ReadLine();
      result += tmp;
   }
   // sleep, increment reconnect, write debugging...
}
stc.pipeServer.Close();

Хотя я полагаю, что переподключение стоит дорого, я не совсем уверен в этом. Один поток данных (примерно 1/11 КБ) занимает всего 130 (соответственно 270 мс для 11 КБ) всего (отправка и получение).

Мой вопрос будет:
Нужно ли принудительно отключать каналы, чтобы сигнализировать, что клиент закончил запись? Насколько мои наблюдения идут,это необходимо только при отправке с помощью libby's, Есть ли другие возможные причины плохой работы? Заранее спасибо.

Кроме того, вот отправка и получение сделано наоборот:

C # (отправка)
 stc.pipeClient.Connect();
 StreamWriter sw = new StreamWriter(stc.pipeClient);
 //sw.AutoFlush = true;
 sw.WriteLine(msg);
 sw.Flush();
 stc.pipeClient.WaitForPipeDrain();  // waits for the other end to read all bytes 
 // neither disconnect nor dispose
Delphi (получение)
 SetLength(S, Stream.Size);   Stream.Read(S[1], Length(S));  
 FPipeBuffer := FPipeBuffer + S;   { TODO 2 : switch case ID }   
// if the XML is complete, i.e. ends with the closing checksum   
if (IsFullMessage()) then
begin
   // end reading, set flag
   FIsPipeReady := true;
end

Ответы на вопрос(3)

Ваш ответ на вопрос