.NET потоки, передача потоков между объектами, лучшие практики (C #) - PullRequest
8 голосов
/ 25 июня 2009

В настоящее время я пишу небольшой игрушечный ассемблер на c # (просматривая книгу по элементам вычислительных систем . Кстати, действительно хорошая книга.)

Ассемблер берет путь к входному файлу и удаляет ненужные строки (комментарии и т. Д.).

Затем файл передается парсеру, а затем, наконец, другому модулю, который создает двоичный код.

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

Я бы хотел просто передать поток следующему объекту. Первоначально я думал, что каждый класс, участвующий в анализе / удалении мусора, будет реализовывать IDisposable, но я думаю, что это означает, что я не могу передать поток следующему объекту для обработки (поток будет закрыт, если я не сохраню все это в одном операторе using? ).

Мне кажется, я чего-то здесь упускаю, есть ли простой способ аккуратно передавать потоки между объектами или мне нужен другой подход?

Заранее спасибо за любую помощь!

Ответы [ 4 ]

9 голосов
/ 25 июня 2009

Как правило, потребитель обязан правильно утилизировать одноразовый предмет. Таким образом, если вы передаете поток другому объекту, вы не должны его утилизировать - это будет обязанностью потребителя.

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

Тогда как насчет случаев, когда вам нужно держать ссылку самостоятельно, но при этом передавать ее? В этих случаях передайте копию ресурса Disposable - это позволит вам и потребителю управлять временем жизни двух экземпляров независимо друг от друга. Однако, если вы попадаете в эту ситуацию, вам следует пересмотреть свой дизайн, как я бы назвал это запахом кода.

2 голосов
/ 25 июня 2009

Если что-то еще использует поток после того, как ассемблер покончит с ним, ассемблер не должен «владеть» потоком. Вызывающая сторона должна либо создать поток для использования ассемблером (и последующими модулями), либо ассемблер должен вернуть новый поток, закрытие которого несет тогда ответственность вызывающего.

Было бы полезно узнать некоторые подробности о том, как выглядит архитектура вашей программы и какие методы мы обсуждаем здесь.

0 голосов
/ 03 сентября 2009

То, как я делал эти проекты в TECS:

  • читать каждую строку в файле
  • обрезать пробелы в начале и конце строки
  • если строка пустая или если она начинается с //, переходите к следующей строке
  • в противном случае сохранить строку в массиве (в C # я фактически использую объект List )

После прохождения всех строк я могу закрыть свой файловый поток и безопасно выполнить свою работу с массивом строк.

0 голосов
/ 25 июня 2009

В целом, я согласен с предыдущими комментариями. Однако, если ваша модель этого не подходит, вы можете сделать то же, что Microsoft сделала с XML Writer: она принимает параметр XMLWriterSettings при его экземпляре, и одно из свойств объекта настроек описывает, должен ли писатель закрывать основной поток при писатель настроен.

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