以下代码正在生成警告。问题是我们需要管道来读写。我该如何安全地丢弃管道?
警告: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。
答案 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这一事实无关。或许它确实如此,您可以类似地扩展示例。