Понимание потоков и их срока службы (сброс, утилизация, закрытие)
Вопрос
Примечание:Я уже прочитал следующие два вопроса:
Можете ли вы объяснить концепцию потоков?
Я пишу на C#
- Почти во всех примерах кода, использующих потоки, почти всегда вызываются .Dispose(), .Flush(), .Close().
- Что достигается в концепции потока?
- Если я не удаляю поток, который я сохранил в переменной, происходит ли где-нибудь утечка моего приложения?
- Зачем мне нужно вызывать любую из этих функций?Я видел примеры кода, которые этого не делают и все равно выполняют работу (без очевидный поломка)
В настоящее время я создаю класс в своем приложении, который содержит основной метод (давайте вызовем его GetStream()
) , который возвращает поток через myWebRequest.GetResponse().GetResponseStream()
Основной метод GetStream()
возвращает Stream
объект, который может быть использован для любой операции, требующей потока (StreamReader, Bitmap() и т.д.).
Есть ли способ автоматически удалять поток после его последнего использования (сбора мусора?) не заставляя никого, кто вызывает .GetStream()
чтобы вручную избавиться от него?
Как вы, вероятно, можете догадаться, мои вопросы расплывчаты и носят общий характер.Мое понимание потоков не является основательным, поэтому я был бы признателен за любые ссылки на полезные статьи, которые предлагают более глубокий взгляд на потоки, чем может предложить вопрос SO.
Решение
Удаление потока закрывает его (и, вероятно, больше ничего не делает). Закрытие потока сбрасывает его и освобождает все ресурсы, связанные с потоком, например дескриптор файла.Очистка потока берет все буферизованные данные, которые еще не были записаны, и сразу же записывает их;некоторые потоки используют внутреннюю буферизацию, чтобы избежать множества небольших обновлений относительно дорогостоящих ресурсов, таких как дисковый файл или сетевой канал.
Тебе нужно позвонить либо 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();
}