下面的代码正在生成一个警告。问题是,我们需要管道来读取和写入。如何安全地处理管道?
警告: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无关。或者它确实如此,您可以类似地扩展示例。