Понимание потоков и их жизни (Flush, Dispose, Close)

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

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

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

я кодирую на C#

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

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

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

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

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

1 ответов


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

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

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

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

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

FileStream stream;

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