2

.NET 3.5 で名前付きパイプを介して通信したい 2 つのアプリがあります。私の人生を楽にするために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;
}
4

1 に答える 1

5

で行った後、から読んでみてoutstream.Write(xml.ToString())ください。その間、他のスレッドがで待機しています。あなたが書き終えたことを知らないので、それは永遠に待ちます。それが知っている限り、さらにデータを書き込むためにもう一度呼び出すことができます。からパイプを実際に閉じるまで、呼び出しは戻りません。doIt()instreamstream.ReadToEnd()outstream.Write()ReadToEnd()doIt()

これらをもう少しインテリジェントに通信させることで、これを回避できます。たとえば、xml.ToString()パイプにの長さを書き込んでから、文字列を書き込むことができます。次に、リーダースレッドで、最初に長さを読み取りmsg_in、次に読み取ります。送信されると予想される正確なバイト数のみを読み取り、パイプが閉じられるのを待つのではなく、すべてを読み取るとすぐに停止します。

于 2009-08-20T22:10:04.100 に答える