2009-08-20 6 views
2

У меня есть 2 приложения, которые я хочу связать через именованные каналы на .NET 3.5. Его парадигма запроса/ответа с данными, передаваемыми как XML, облегчает мою жизнь. Существует приложение-слушатель и приложение, которое отправляет запросы на канал. Я пытаюсь использовать двунаправленную трубку для этого. Проблема в том, что вызов StreamReader.ReadToEnd(), похоже, не возвращается. Что я могу сделать, чтобы исправить это?двунаправленный именованный трубопровод вопрос

Слушатель код

public Class Listener 
{ 
    private void ThreadFunc() 
    { 
     var pipe = new NamedPipeServerStream("GuideSrv.Pipe",PipeDirection.InOut); 
     var instream = new StreamReader(pipe); 
     var outstream = new StreamWriter(pipe); 
     while (true) 
     { 
      pipe.WaitForConnection(); 
      var response = ProcessPipeRequest(instream); 
      outstream.Write(response.ToString()); 
      pipe.Disconnect(); 
     } 
    } 
    private XDocument ProcessPipeRequest(StreamReader stream) 
    { 
     var msg_in = stream.ReadToEnd(); // << This call doesnt return 
     var xml_in = XDocument.Parse(msg_in); 
     // do some stuff here 
     return new XDocument(....); 
    } 
} 

Запроса код

public XDocument doIt() 
{ 
    var xml = new XDocument(....); 
    using (var pipe = new NamedPipeClientStream(".", "GuideSrv.Pipe", PipeDirection.InOut)) 
    { 
     using (var outstream = new StreamWriter(pipe)) 
     using (var instream = new StreamReader(pipe)) 
     { 
      pipe.Connect(); 
      outstream.Write(xml.ToString()); 
      xml = XDocument.Parse(instream.ReadToEnd()); 
     } 
    } 
    return xml; 
} 

ответ

6

После этого outstream.Write(xml.ToString()) в doIt() вы попробуйте прочитать из instream. Тем временем ваша другая нить ждет в stream.ReadToEnd(). Он будет ждать вечно, потому что он не знает, что вы закончили писать. Насколько известно, вы можете очень хорошо позвонить outstream.Write(), чтобы написать еще несколько данных. Звонок ReadToEnd() не вернется, пока вы фактически не закроете трубку от doIt().

Вы можете обойти это, заставив их общаться друг с другом немного разумнее. Например, можно записать длину строки xml.ToString() в трубку, а затем записать строку. Затем в потоке вашего читателя вы сначала читаете длину, а затем читаете msg_in, только читаете точное количество байтов, которые вы ожидаете отправить, останавливаясь, как только вы их прочитаете, а не ожидаете закрытия трубы.

 Смежные вопросы

  • Нет связанных вопросов^_^