Подтвердить что ты не робот

Понимание потоков и их срока службы (Flush, Dispose, Close)

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

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

С# с использованием потоков

Я кодирую в С#

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

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

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

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

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

4b9b3361

Ответ 1

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

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

В С# он идиоматичен для вызова Dispose посредством блока using, который является синтаксическим сахаром для блока try-finally, который размещается в конце, например:

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

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

FileStream stream;

try
{
    stream = new FileStream(path);
    // ...
}
finally
{
    if (stream != null)
        stream.Dispose();
}