Удаление объекта, который имеет 2 потока - PullRequest
3 голосов
/ 06 февраля 2012

Следующий код генерирует предупреждение. Проблема в том, что нам нужен канал для чтения и записи. Как я могу безопасно утилизировать трубу?

предупреждение: CA2202: Microsoft.Usage: объект '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, чтобы увидеть эти предупреждения (это не предупреждения компилятора c #).

Проблема состоит в том, что StreamReader sr и StreamWriter sw оба утилизируют объектный канал.

Ответы [ 3 ]

1 голос
/ 06 февраля 2012

То, что вы делаете, должно «безопасно» утилизировать трубу. Я обычно нахожу это предупреждение компилятора очень утомительным, объекты должны быть счастливыми, если их удаляют несколько раз, и это действительно хорошо для экземпляра NamedPipeClientStream. Я бы предложил игнорировать это предупреждение здесь.

Для информации - способ преодолеть это предупреждение - написать свою собственную попытку, наконец блокирует вместо использования конструкции 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();
  }
}
1 голос
/ 06 февраля 2012

Вам следует игнорировать предупреждение и пометить его. StreamReader не должен располагать внутренним потоком. Ему не принадлежит.

0 голосов
/ 06 февраля 2012

Посмотрите этот пример на MSDN, чтобы узнать, как справиться с этим делом:

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

Это ваша труба, которая утилизируется дважды, и я не думаю, что этовсе, что связано с тем, что вы используете как StreamReader, так и StreamWriter.Или, возможно, это так, и вы можете просто продолжить пример аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...