Понимание потоков и их срока службы (сброс, утилизация, закрытие)

StackOverflow https://stackoverflow.com/questions/1864543

  •  16-09-2019
  •  | 
  •  

Вопрос

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

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

C #, использующий потоки

Я пишу на C#

  1. Почти во всех примерах кода, использующих потоки, почти всегда вызываются .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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top