2つのストリームを持つオブジェクトの廃棄

次のコードは警告を生成しています。問題は、読み取りと書き込みの両方にパイプが必要なことです。どうすれば安全にパイプを処分できますか?

警告:CA2202:Microsoft.Usage:Object 'pipe'は、メソッド 'ClientConnection.qaz()'に複数回配置することができます。 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 Code Analysisが必要です(これらはC#のコンパイラの警告ではありません)。

問題は、StreamReaderの sr とStreamWriter sw オブジェクトパイプの両方のDisposeです。

3

3 答え

あなたがしていることは、パイプを「安全に」廃棄するべきです。私は一般に、このコンパイラが非常に面倒な警告を出すことを知っていますが、 NamedPipeClientStream のインスタンスに対して複数回処理するのがうれしくありません。私はここでこの警告を無視することをお勧めします。

情報のために - この警告を克服する方法はあなた自身のtry、/a>を使用するのではなく、

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();
  }
}
はい、CA2202は無視してください。それは愚かな警告です。
追加された 著者 porges,
srとswの両方がオブジェクトパイプを破棄するので、まだ問題があります。
追加された 著者 David,

iMHOは警告を無視し、警告を表示する必要があります。 StreamReaderは内部ストリームを破棄することは想定されていません。それはそれを所有していません。

1
追加された

このケースを処理する方法については、MSDNの次の例を参照してください。

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

あなたのパイプは2回処理されていますが、これはStreamReaderとStreamWriterの両方を使用しているという事実とは関係ありません。あるいは、おそらくそうであり、同様にその例を拡張することができます。

0
追加された