处理具有两个流的对象



下面的代码正在生成一个警告。问题是,我们需要管道来读取和写入。如何安全地处理管道?

警告:CA2202:Microsoft.用法:可以在方法"ClientConnection.qaz()"中多次释放对象"pipe"。若要避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose。:线路: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#编译器警告)。

问题是StreamReadersr和StreamWritersw都处理对象管道。

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

您所做的应该"安全"地处理管道。我通常觉得这个编译器警告非常令人讨厌,对象应该很乐意被多次处理,事实上,对于NamedPipeClientStream的实例来说,这样做是很好的。我建议忽略这里的警告。

关于信息,克服这个警告的方法是编写自己的try,finally块,而不是使用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();
  }
}

查看MSDN上关于如何处理这种情况的示例:

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

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

相关内容

  • 没有找到相关文章

最新更新