Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

В каких случаях надо закрывать поток, а в каких не надо?

09.01.2013, 05:36. Показов 4819. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кашу маслом не испортишь- это не наш метод, сразу говорю

++++++++++++++++++++++++++++++++++++++++ +

У меня в книге "Visual C# 2010 ПОЛНЫЙ КУРС " Карли Уотсон, Кристиан Нейгел, ЯкобХаммер Педерсен, Джон Рид, Морган Скиннер

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

Спасибо, кто откликнется
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.01.2013, 05:36
Ответы с готовыми решениями:

В каких случаях необходимо использовать equals, а в каких ==
Пожалуйста, можете привести пример, каких случаях необходимо использовать equals, а в каких == ?

String и StringBuilder - что и в каких случаях?
в string хранятся неизменяемые строки, а в StringBuilder изменяемые. Значит ли это, что следует пользоваться только StringBuilder-ом? Или в...

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

18
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.01.2013, 07:10
Всегда закрывать, когда они уже не нужны
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.01.2013, 07:21  [ТС]
То есть названные авторы не правы, не закрывая потоки, да?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.01.2013, 07:36
kravam, ну вы покажите, может там какой-нибудь BackgroundWorker, он сам закрывает, когда заканчивает работу. Я все-таки книг не писал и не думаю, что авторы полные идиоты. Если не закрывают, то скорее всего, они просто используют какую-то обертку, которая сама это делает, т.к. потоки это критический ресурс, и надо быть реально тупым, чтобы их бросать просто так (тем более, что программа из-за работающих дочерних потоков часто у людей не закрывается, как раз из-за таких вот "умных" идей написать поменьше кода и не закрыть их нормально). Тем более в авторах Нейгел. Всяко поумнее меня будет. Да и 99% форумчан
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.01.2013, 08:50  [ТС]
код маленький. я решил ничё не убирать.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace WriteFile
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] byData;
            char[] charData;
 
            try
            {
                FileStream aFile = new FileStream("Temp.txt", FileMode.Create);
                charData = "My pink half of the drainpipe.".ToCharArray();
                byData = new byte[charData.Length];
                Encoder e = Encoding.UTF8.GetEncoder();
                e.GetBytes(charData, 0, charData.Length, byData, 0, true);
 
                // Move file pointer to beginning of file.
                aFile.Seek(0, SeekOrigin.Begin);
                aFile.Write(byData, 0, byData.Length);
            }
            catch (IOException ex)
            {
                Console.WriteLine("An IO exception has been thrown!");
                Console.WriteLine(ex.ToString());
                Console.ReadKey();
                return;
            }
        }
    }
}
aFile не закрывается, как видим.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.01.2013, 09:02
kravam, ну вот пример с того же msdn
http://msdn.microsoft.com/ru-r... 10%29.aspx
Просто пишите using, он автоматом закроет поток (даже если вылетит эксепшн).
А что до этого кода: я склоняюсь к тому, что опечатка. Это довольно серьезная ошибка-таки. Вроде гонки потоков.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.01.2013, 09:06  [ТС]
Опечатка это когда вместо колено пишут полено. Тут что-то другое.
СЛЕДУЮЩИЙ код в этой же книге.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace ReadFile
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] byData = new byte[200];
            char[] charData = new Char[200];
 
            try
            {
                FileStream aFile = new FileStream("../../Program.cs", FileMode.Open);
                aFile.Seek(113, SeekOrigin.Begin);
                aFile.Read(byData, 0, 200);
            }
            catch (IOException e)
            {
                Console.WriteLine("An IO exception has been thrown!");
                Console.WriteLine(e.ToString());
                Console.ReadKey();
                return;
            }
 
            Decoder d = Encoding.UTF8.GetDecoder();
            d.GetChars(byData, 0, byData.Length, charData, 0);
 
            Console.WriteLine(charData);
            Console.ReadKey();
        }
    }
}
а за ссыль спасибо.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.01.2013, 09:13
Мне кажется, что все ресурсы закрываются автоматически при завершении программы. Но на самом деле это все равно является плохим кодом, который приучает к небрежности.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.01.2013, 09:16  [ТС]
Ладно, подождём других мнений.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
09.01.2013, 09:37
Факты:
1. При завершении приложения (всех его потоков) - закрываются все файлы/файловые потоки/соединения с БД/и т.п.
2. Если файловый поток не закрыт явно - скорее всего[*] он будет закрыт при вызове сборщика мусора. (Сборщик мусора вызывает деструктор)
3. Закрытие файлового потока может быть довольно долгой/затратной операцией
4. Если захвачен файловый поток, то другие приложения, не смогут совершать операции с файлом. Возможны исключения, но в общем случае - не смогут.
5. При возникновении критической ошибки в программе/ОС, не закрытый файловый поток, может содержать некорректные данные.

Далее, из всех этих фактов разработчик сам должен выбрать стратегию закртытия файловых потоков.
Например, если программа очень коротка и выполняется, то смысла явно прописывать закрытие потока мало - после завершения приложения, все равно все закроется/сбросится.
Например, если автор книги хочет продемонстрировать работу метода FileStream: seek. То совершенно необязательно раздувать код приложения в книге, и каждый раз явно закрывать поток.

[*] Скорее всего, в данном случае означает, что большинство классов из BCL, использующих нативные ресурсы, содержат правильный деструктор, закрывающий файл. Однако это не означает, что при разработке вам никогда не встретятся такие классы, не реализующие данную особенность.
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
09.01.2013, 09:40
В деструкторе все закроется. Но все равно лучше использовать using

Добавлено через 1 минуту
Цитата Сообщение от turbanoff Посмотреть сообщение
При завершении приложения (всех его потоков) - закрываются все файлы/потоки/и т.п.
Да ладно. Т.е. если я создам поток (Thread) он сдохнет после окончания программы сам о_О?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
09.01.2013, 09:42
Цитата Сообщение от Пaтрик Посмотреть сообщение
Да ладно. Т.е. если я создам поток (Thread) он сдохнет после окончания программы сам о_О?
Всему виной, двоякость перевода слова поток, на английский язык (Thread/Stream). В первом случае имелся ввиду Thread, во втором - Stream. Я поправил пост, для полной ясности.
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
09.01.2013, 09:44
Цитата Сообщение от turbanoff Посмотреть сообщение
Например, если программа очень коротка и выполняется,
выполняется быстро
конечно, же
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.01.2013, 09:47  [ТС]
Цитата Сообщение от Пaтрик Посмотреть сообщение
Да ладно. Т.е. если я создам поток (Thread) он сдохнет после окончания программы сам о_О?
, да, именно так и будет.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.01.2013, 09:55  [ТС]
Джефри Рихтер, "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows"
глава 4 "Процессы"
Что происходит при завершении процесса

А происходит вот что.

Выполнение всех потоков в процессе прекращается
Добавлено через 5 минут
turbanoff, я учёл всё выше сказанное. Поехали дальше:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace StreamWrite
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                FileStream aFile = new FileStream("Log.txt", FileMode.OpenOrCreate);
                StreamWriter sw = new StreamWriter(aFile);
 
                bool truth = true;
                // Write data to file.
                sw.WriteLine("Hello to you.");
                sw.WriteLine("It is now {0} and things are looking good.",
                             DateTime.Now.ToLongDateString());
                sw.Write("More than that,");
                sw.Write(" it's {0} that C# is fun.", truth);
                sw.Close();
            }
            catch (IOException e)
            {
                Console.WriteLine("An IO exception has been thrown!");
                Console.WriteLine(e.ToString());
                Console.ReadLine();
                return;
            }
        }
    }
}
Два потока,
C#
1
2
FileStream aFile = new FileStream("Log.txt", FileMode.OpenOrCreate);
                StreamWriter sw = new StreamWriter(aFile);
один так закрывают, а второй нет
C#
1
 sw.Close();
++++++++++++++++++++++++++++++++++++++

Так уж и не закрывали бы оба сразу! А теперь аргумент- а зачем поток (aFile) закрывать если он и так закроется в свете этого закрывания не звучит.
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
09.01.2013, 10:02
Цитата Сообщение от kravam Посмотреть сообщение
А теперь аргумент- а зачем поток (aFile) закрывать если он и так закроется в свете этого закрывания не звучит.
Потому что никто не знает как работает сборщик мусора и когда он найдет объект на который больше нет ссылок. Явное закрытие даст доступ к файлу другим программам. И это, как мне кажется, хороший тон - самому закрывать потоки.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
09.01.2013, 10:07  [ТС]
Да, но дядьки-авторы-то не закрывают- ну ладно, там разъяснили что потому не закрывают, что программа вот-вот закончится. Но в последнем примере два потока есть и один закрывают, а другой нет.
Это что вообще?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.01.2013, 10:08
Полагаться в этом на ось всё таки не надо, а надо всё закрывать явно.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.01.2013, 10:14
Если используется "голый" поток, то лучше закрывать всегда. Да, при завершении программы ОС сама позакрывает дескрипторы, но лучше все-таки заиметь привычку делать это самому.
Если используются декораторы потоков (напр., StreamWriter), то достаточно закрывать только самый внешний декоратор - он по цепочке захлопнет всё остальное.

Что касается потоков, которые Thread, то при завершении работы приложения автоматом схлапываются только фоновые потоки, а все остальные - нет.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.01.2013, 10:14
Помогаю со студенческими работами здесь

В каких случаях неявно вызывается objectName.ToString()?
В каких случаях неявно вызывается objectName.ToString()?

В каких случаях лучше использовать класс с параметрами?
public class Pair<TFirst,TSecond>{ public TFirst First; public TSecond Second; } Если сделать вот так: ...

В каких случаях стоит применять метод File.AppendText()?
Думал, что File.AppendText - простая надстройка над using (StreamWriter sw = new StreamWriter(path)) { ...

В каких случаях лучше применять ту или иную сортировку?
В каких случаях лучше применять ту или иную сортировку? Сортировки: Пузырьком Вставками Выбором Слиянием Шелла Быстрая

Для чего нужен оператор using и в каких случаях он необходим?
Несколько раз сталкивался в C# с оператором using. Но не могу понять для чего он нужен. Сейчас разбираюсь с opencvsharp. Нашел в интернете...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru