处理具有2个流的对象

时间:2012-02-06 14:14:39

标签: c# stream

以下代码正在生成警告。问题是我们需要管道来读写。我该如何安全地丢弃管道?

  

警告:CA2202:Microsoft.Usage:对象'pipe'可以在方法'ClientConnection.qaz()'中多次处理。为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose:Lines:465

void qaz()
{
    const string THIS_SERVER = ".";
    using (NamedPipeClientStream pipe = new NamedPipeClientStream(THIS_SERVER, this.Name,
                                                                   PipeDirection.InOut,
                                                                   PipeOptions.None))
    {
        using (StreamReader sr = new StreamReader(pipe))
        {
            string message = sr.ReadLine();
            using (StreamWriter sw = new StreamWriter(pipe))
            {
                sw.WriteLine("ACK received"); 
            }
        }
    }
}

您需要Visual Studio代码分析才能看到这些警告(这些不是c#编译器警告)。

问题是StreamReader sr 和StreamWriter sw 都是对象管道的Dispose。

3 个答案:

答案 0 :(得分:1)

你应该iMHO忽略警告并标记它。 StreamReader不应该处理内部流。它不拥有它。

答案 1 :(得分:1)

你在做什么应该'安全'处理管道。我通常发现这个编译器警告非常令人讨厌,对象应该很乐意多次处理,事实上对NamedPipeClientStream的实例这样做很好。我建议在这里忽略这个警告。

有关信息 - 克服此警告的方法是write your own try, finally blocks,而不是使用using构造:

NamedPipeClientStream pipe = null;
try 
{
  pipe = new NamedPipeClientStream(THIS_SERVER, this.Name, PipeDirection.InOut, PipeOptions.None);
  using (StreamReader sr = new StreamReader(pipe))
  {
    string message = sr.ReadLine();
    using (StreamWriter sw = new StreamWriter(pipe))
    {
        sw.WriteLine("ACK received"); 
    }
  }
  pipe = null;
} 
finally 
{
  if (pipe != null)
  {
    pipe.Dispose();
  }
}

答案 2 :(得分:0)

在MSDN上查看有关如何处理此案例的示例:

http://msdn.microsoft.com/en-us/library/ms182334.aspx

您的管道被处理两次,我认为这与您同时使用StreamReader和StreamWriter这一事实无关。或许它确实如此,您可以类似地扩展示例。