Вопрос по stream, flush, c#, dispose – Понимание потоков и их времени жизни (очистка, удаление, закрытие)

22

Примечание: яМы уже прочитали следующие два вопроса:

Можете ли вы объяснить концепцию потоков?

C # используя streamsI '

м кодирования в C #

Почти во всех примерах кода, использующих потоки, почти всегда вызываются .Dispose (), .Flush (), .Close ().Что происходит в концепции потока?Если я неРасполагать поток, который я хранил в переменной, мое приложение где-то просачивается?Почему мне нужно вызывать любую из этих функций? Я'видел примеры кода, которые несделать это и по-прежнему выполнять работу (безочевидный поломка) Я

м в настоящее время строит класс в моем приложении, который содержит основной метод (давайте вызовем егоGetStream()) который возвращает поток черезmyWebRequest.GetResponse().GetResponseStream()

Основной методGetStream() возвращаетStream объект, который можно использовать для любой операции, для которой требуется поток (StreamReader, Bitmap () и т. д.).

Есть ли способ автоматически удалять поток после его последнего использования (сборщик мусора?), Не заставляя никого вызывать.GetStream() вручную утилизировать его?

Как вы, вероятно, можете сказать, мои вопросы расплывчаты и носят общий характер. Мое понимание потоков не является надежным, поэтому любые ссылки на полезные статьи, которые предлагают более углубленный взгляд на потоки, чем может предложить вопрос SO, будут приветствоваться.

Ваш Ответ

1   ответ
32

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

Вам нужно позвонить либоClose или жеDispose в большинстве потоков, или ваш код неверен, потому что основной ресурс выигралне может быть освобожден для использования кем-то еще, пока не придет сборщик мусора (кто знает, как долго это будет продолжаться?)Возьму.)Dispose предпочтителен как само собой разумеющееся; Это'ожидается, что выБуду утилизировать все одноразовые вещи в C #. Вы, вероятно, ненужно позвонитьFlush явно в большинстве сценариев.

В C # этоидиоматично звонитьDispose в порядкеusing блок, который является синтаксическим сахаром для блока try-finally, который расположен в файле finally, например:

using (FileStream stream = new FileStream(path))
{
    // ...
}

функционально идентичен

FileStream stream;

try
{
    stream = new FileStream(path);
    // ...
}
finally
{
    if (stream != null)
        stream.Dispose();
}
using Блок напрямую использует интерфейс IDisposable, вызываяDispose() метод выхода из области:msdn.microsoft.com/en-us/library/... Dagrooms
Это's ошибка компилятора, чтобы использовать 'с помощью' на переменную, которая 'не известно, чтобы быть IDisposable. Однако технически это должно быть: if (stream! = Null) stream.Dispose (); Tim Robinson
Наконец, должно быть: `if (поток является IDisposable) ((IDisposable) stream) .Dispose (); Gonzalo
Во многих случаях этоХорошая идея явно закрыть поток, даже если он также вызываетDispose, Закрытие потока может потребовать выполнения действий, которые не могут быть гарантированно успешными; реализацииClose обычно выдает исключение при возникновении таких проблем, в то время как некоторыеDispose реализации могут задушить такие исключения (проглатывание таких исключений является злом, но позволяет им распространяться изDispose часто ударит предыдущее исключение, которое также является злом; реализации различаются относительно того, какое зло считается меньшим) .A supercat

Похожие вопросы