массив потоков в диез - PullRequest
4 голосов
/ 09 июля 2010

Обычно я объявляю потоки внутри оператора using, чтобы убедиться, что поток правильно расположен, когда я с ним покончу, и чтобы я не по ошибке вызывал его, когда я вне блока using.

Некоторые примеры здесь: MSDN с использованием справочника операторов

Как использовать оператор using с массивом потоков? Было бы эквивалентно объявить массив вне блока try / catch / finally и вызвать метод dispose каждого потока в блоке finally?

Наконец, как можно проверить правильность расположения потоков?

Ответы [ 3 ]

7 голосов
/ 09 июля 2010

Я бы создал новый объект, который содержит в себе потоки. Как-то так (не совсем конкретизировано):

class StreamHolder : IDisposable
{
  List<Stream> Streams {get;}

  public void  Dispose()
  {
      Streams.ForEach(x=>x.Dispose()):
  }
}

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

3 голосов
/ 09 июля 2010

Вы должны делать то, что делает using, не используя using.

Это означает циклический просмотр массива и вызов Dispose для каждого экземпляра (после явного приведения к IDisposable, если необходимо),Сделайте этот цикл в блоке finally.

Наконец, вы не проверяете, правильно ли они утилизируются.После вызова Dispose вы должны просто обнулить их, поскольку вы больше не можете их использовать.

2 голосов
/ 09 июля 2010

Оператор using () - это шаблон для удаления, предназначенный для повторного ознакомления с полезными привычками, но он не обязателен.Существует множество ситуаций, в которых вам нужно хранить объекты вне времени жизни функции с областью действия.

Хотя я думаю, что вам, вероятно, следует сконструировать таким образом, чтобы вы могли использовать оператор using (), важно, чтобыв некотором блокирующем блоке finally вы располагаете каждый из потоков.

Чтобы ответить на последний вопрос, не представляется, что у класса Stream есть какой-либо метод или свойство, позволяющее определить, был ли он закрыт / удален, однако еслишаблон IDisposable реализован правильно, вы можете снова вызвать Close / Dispose, если вам нужно быть уверенным.

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