Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47

Передача значения метода цикла в другой метод и возврат обратно в цикл

24.11.2020, 18:51. Показов 4830. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, есть практическая задача: осуществлять считывание большого (десятки млн строк) текстового файла, выполнять математические фиксированные операции над числами строки и записывать их в новый файл. Хочу для нормального оформления кода выводить отельные операции в отдельные методы и столкнулся с проблемой решения некоторых задач. Далее для простоты приведены примеры (несмотря на то что делается в WinForms, тут идут сугубо темы наследования переменных из метода-в-метод

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
 private bool button5Click = false; //Ввод булева условия, нажата ли кнопка
    private void button5_Click(object sender, EventArgs e5) //Запуск преобразования облака точек
    {
      button5Click = true;
        }
    private void Read_And_Write_PTSFile(bool start, string CoordXYZ_2) //Запуск операции считывания файла и записи в новый
        {
      if (button5Click == true)
      {
        string DataPath = openFileDialog1.FileName;
        string[] Data = File.ReadAllLines(DataPath);
        //string DataStr = null;
        for (int i2 = 0; i2 < Data.Length; i2++)
        {
          string DataStr = Data[i2];
          using (StreamWriter SavePTSFile = new StreamWriter(saveFileDialog1.FileName, true, Encoding.UTF8))
          {
            SavePTSFile.WriteLine($"{CoordXYZ_2}");
            SavePTSFile.Close();
            SavePTSFile.Dispose();
 
          }
        }
      }
    }
А сама конструкция расчета упрощенно выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
private string CalcCSTransform(string DataStr)
    {
      string[] DataStrValues = DataStr.Split(new char[] { ' ' });
      //Инициация исходных данных
      double CoordX = Convert.ToDouble(DataStrValues[0]);
      double CoordY = Convert.ToDouble(DataStrValues[1]);
      double CoordZ = Convert.ToDouble(DataStrValues[2]);
//Операции
      string CoordXYZ_2 = $"{CoordX_2},{CoordY_2},{CoordZ}";
      return CoordXYZ_2;
}
Вопрос собственно как осуществлять передачу строки
C#
1
DataStr = Data[i2];
из метода Read_And_Write_PTSFile в метод CalcCSTransform, ждать окончания формирования строки-ответа
C#
1
string CoordXYZ_2
и записывать ее в файл, после чего повторять по новой в рамках всего цикла for

P.S. Знаю что операции будут идти долго на 1 потоке, хочу начать вводить многопоточность - чтение/запись части файла в отдельные файлы и потом объединение итогового, а для этого (и вообще для саморазвития) - оформлять функции в отдельные методы
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2020, 18:51
Ответы с готовыми решениями:

Передача двумерного массива из одного метода в другой метод
Привет Всем! Как тут принято писать: &quot; Java начал изучать не так давно&quot; :) Появился вопрос: как передать значения двумерного массива из...

Как передать входящее значение одного метода класса на возврат в другой метод того же класса?
Я самый новейший новичок. Помогите.Как передать входящее значение (количество еды) метода feed класса Cat на возврат(return) в метод...

Передача значения из цикла из одного потока в другой
В одном цикле крутится перменная $preset. В другом потоке тоже в цикле нужно прочитать её значение. Перемення объявлена с префиксом shared,...

42
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
25.11.2020, 00:32  [ТС]
Студворк — интернет-сервис помощи студентам
Оуфффф, как сложно
Тогда пожалуй лучше сделаю потоковые вычисления, а записи в рамках одной операции;
Где кстати лучше почитать о корректной работе такой? Чтобы не понаступать на грабли
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
25.11.2020, 00:43
CLR via C#, Джеффри Рихтер, Глава 28. Асинхронные операции ввода-вывода. Или всю 5 часть.
1
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.11.2020, 00:47
Georg Keneberg, потокобезопасные коллекции - https://docs.microsoft.com/ru-... concurrent. Насчет синхронизации - можно начать тут https://metanit.com/sharp/tutorial/11.4.php, почитать про все способы синхронизации. Правда на метаните не про все рассказано, к примеру, есть такая полезная штука как барьер https://docs.microsoft.com/ru-... ng/barrier. Если соберетесь многопоточно писать/читать файлы, синхронизировать доступ в любом случае придется.

Добавлено через 2 минуты
ReaderWriterLock и ReaderWriterLockSlim тоже пригодится https://docs.microsoft.com/ru-... writerlock
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
25.11.2020, 00:53
Цитата Сообщение от Georg Keneberg Посмотреть сообщение
по части чтения файла у меня была мысль первым шагом считать куски файла в StringBuilder для N частей, затем запустить обработчик кода на N потоков, которые будут преобразовывать часть в StringBuilder, считать, затем заносить
При работе с файлами от потоков обычно только хуже бывает.
У вас же не какой-то супер сервер с множественным Raid массовом.
Поток чтения с накопителя только один.
И дербанить его между разными потоками - только замедлит его работу.

Единственное из-за чего может тормозить программа - это забивка ОЗУ мусором.
Что неявно приводит к активному использованию накопителя несколькими потоками.

При большом количестве string быстро забивает память.
Причины этого вам уже выше объяснили.
Поэтому желательно избавиться от него.
Избавляться надо начинать с формата файлов.
Если вам надо сохранить текстовый формат, то лучше использовать ASCII.
Это позволит отказать и от string, и от char. И перейти на обработку байтов.

Лучший же вариант, если вам не нужен текстовый формат и вы можете использовать BinaryWriter и BinaryReader.
Это позволит полностью исключить string сильно разгрузит память.

Добавлено через 1 минуту
Цитата Сообщение от Georg Keneberg Посмотреть сообщение
Тогда пожалуй лучше сделаю потоковые вычисления, а записи в рамках одной операции;
У вас же там просто преобразование координат?
Это почти мгновенные операции.
Потоки ни чего не ускорят, только добавят геморроя.
2
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.11.2020, 02:17
Еще зависит от диска. У меня есть довольно старенький обычный hdd, который рассчитан на подобную работу, оптимизирован для многопоточной записи видеопотоков, правда хорошо подобные hdd справляются только с командами одного типа - либо чтение, либо запись, одновременно и то, и другое не очень. В hdd зависит от количества блинов, головок, скорости вращения, прошивки, размера кэша. В ssd от кэша, типа контроллера и прошивки, типа памяти, впрочем даже дешевые ssd нормально разгребают большую глубину очереди. А так в общем-то те же торренты пишут данные в многопотоке и даже на медленных hdd вполне нормально работают. Правда и диск могут нагрузить по полной. Надо ли писать в многопоток или не надо это уже стоит подумать, например если программа будет распространяться, то юзеры с медленными дисками могут удивиться, что при работе программы у них появляются тормоза, особенно если диск параллельно используется системой или чем-то еще. Если для себя - то прикинуть, стоит ли с этим заморачиваться, одно дело торренты с гигабайтами данных и другое дело текстовый файлик записать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
25.11.2020, 11:45
Цитата Сообщение от randok Посмотреть сообщение
Еще зависит от диска....
Здесь задача несколько иная.
Много поточное обращение к накопителю применяется там где нужны одновременно (для одного или разных приложений) разные файлы или разные участки одного файла.

В данном же случае нужно обработать полностью один файл.
А для такой операции на любом накопителе разбивка на отдельные потоки даст только ухудшение.
И ухудшение, скорее всего, в разы.
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.11.2020, 15:36
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В данном же случае нужно обработать полностью один файл.
Так-то да, но если там миллионы строк, то можно раскидывать по разным файлам. Опять же, смотря куда потом эти обработанные данные пойдут, далеко не каждое приложение нормально откроет файл с миллионами строк.
0
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
25.11.2020, 17:05  [ТС]
Справедливости ради стоит отметить что млн строк это уже вчерашний день, технологии так ускакали вперед что уже есть и млрд. строк [речь, правда, об эквивалентном размере строк - так как такие большие данные лежат в бинарных файлах] - много "избыточных" данных, которые чисто технически нереально загрузить ни в одно ПО для работы (там нужны операции "умного прореживания" - алгоритмы есть, но работают с частью данных, как ни крути, выдавая уже вменяемое число точек)
Вообще, прямой пересчет координат это вынужденная мера, так как есть форматы которые позволяют задавать трансформацию начала координат (то есть просто записывается матрица 4х4, хранящая 9 нелинейных функций от трех Эйлеровых углов поворота и 3 смещения (dX, dY, dZ) либо вовсе прямое описание проекции системы координат)
____
Я вот хотел попробовать оптимизировать код, считывая фрагменты файла, так как попытавшись считать и перевести файл с 23 млн точек (680 Мб) он за 10 секунд забивал по 3 Гб памяти и падал с сигналом что-то с System.OutOfMemoryException
Итак - начало стандартное:

C#
1
2
3
4
5
6
StringBuilder sb = new StringBuilder(); //Содержимое файла
StringBuilder sb2 = new StringBuilder(); //Результат
    private void button5_Click(object sender, EventArgs e5) //Запуск преобразования облака точек
          {
      Read_PTSFile();
       }
1. Начинаем считывать файл (тут я и заглох как именно задавать емкость и как возвращаться на то же место без тяжелых операций)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 private void Read_PTSFile()
    {
      sb.Capacity = 100000; //Ограничиваем объем хранилища (ограничение небольшое - чтобы проконтролировать на небольшом файле)
      int FileCount = 0;
      //Считаем строки файла
      foreach (var Line in File.ReadLines(openFileDialog1.FileName))
      {
        FileCount++;
      }
      int i1 = 0;
        do
      {
        foreach (var Line in File.ReadLines(openFileDialog1.FileName))
        {
          sb.AppendLine(Line);
          i1++; 
        }
      } while (sb.Capacity < sb.MaxCapacity);
    CalcCSTransform(sb);//Считаем значения и вносим в sb2
      WriteToPTS(sb2);// Записываем sb2 в файл
      sb.Clear();//Обнуляем 
      sb2.Clear();//Обнуляем
}
Нашел тут интересное решение (?) но пока в силу слабого понимания языка не пойму о чем речь. Раньше бы делал делая массив строк File.ReadAllLines - но хотел бы уйти от этого теперь... а как по другому не пойму
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
25.11.2020, 17:08
Цитата Сообщение от randok Посмотреть сообщение
Так-то да, но если там миллионы строк, то можно раскидывать по разным файлам.
Что это решит?

Любой накопитель - это последовательное устройство.
В накопителе не существует файлов.
Эта сущность более высокого порядка.
И для переключения для доступа к различным участкам (без разницы одного файла или нескольких) требуется дополнительное время.
Для некоторых дисков эти затраты меньше, для других больше, но они всегда есть.
Для большинства накопителей произвольный доступ многократно затратнее последовательного.
Мультидоступ применяется не для ускорения - он всегда медленнее.
Он нужен для возможности параллельно работать с накопителем нескольким приложениям.
При этом каждое из них будет работать медленнее.


Проблемы здесь именно физического характера и программным путём ничего не решишь.
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.11.2020, 17:50
Georg Keneberg, вам не нужно два стрингбилдера. И зачем кстати вы два раза читаете файл. Как вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
            long counter = 0;
            foreach (var line in File.ReadLines(openFileDialog1.FileName))
            {
                counter++; 
                var lineData = line.Split(' ').Select(s => Convert.ToDouble(s, CultureInfo.InvariantCulture)); // разбиваем строку в массив double
                CalcCSTransform(lineData); // передаем массив double для расчета
                if (counter % 10000 == 0) // например каждые 10 тысяч строк
                {
                    // вызываем дозапись в файл и обнуляем стрингбилдер
                }
            }
Стрингбилдер можно использовать только в CalcCSTransform после расчета каждого массива сделать Append.

Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И для переключения для доступа к различным участкам (без разницы одного файла или нескольких) требуется дополнительное время.
Это верно для hdd, где движущиеся механические части и пока они туда-сюда, проходит время. Поэтому hdd настолько тормозные при работе со случайными блоками данных. С ssd все лучше на порядки, особенно если контроллер умеет в несколько потоков. Я поэтому и писал, что если для себя это делается - то может и имеет смысл прикинуть, стоит ли заморачиваться. Для масс распространения не пойдет разумеется.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
25.11.2020, 19:10
Цитата Сообщение от randok Посмотреть сообщение
Это верно для hdd,
Разница между HDD и SSD количественная, а не качественная.
Все проблемы как были так и остались.
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.11.2020, 19:18
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Разница между HDD и SSD количественная, а не качественная.
Все проблемы как были так и остались.
Не спорю, но разница в скорости доступа на порядки это очень существенно и можно нормально работать, не сильно оглядываясь на то, что диск помирает, не справляясь с очередью данных. Какой-нибудь качественный ssd с количеством операций ввода/вывода в полмиллиарда в секунду нагрузить будет сложно обычными задачами даже в многопоток.
0
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
25.11.2020, 22:23  [ТС]
Цитата Сообщение от randok Посмотреть сообщение
Как вариант:
Простите, но я что-то совсем не пойму почему так не работает, по разному уже пробовал
Единственное, по сравнению с вашим я явно указал на массив lineData, чтобы иметь возможность передать явно этот элемент в модуль расчета - но такое впечатление что операции вообще не идут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private void Read_PTSFile()
    {
      long counter = 0;
      //Считаем строки файла
      foreach (var Line in File.ReadLines(openFileDialog1.FileName))
      {
        counter++;
        double[] lineData = Line.Split(' ').Select(s => Convert.ToDouble(s)).ToArray(); // разбиваем строку в массив double
        CalcCSTransform(lineData, sb2);
        if (counter % 1000000 == 0)
        {
          WriteToPTS(sb2);
          sb2.Clear();//Обнуляем
        }
      }
      //Если файл меньше или надо дозаписать остатки:
      WriteToPTS(sb2);
      sb2.Clear();//Обнуляем
    }
private void CalcCSTransform(double [] lineData, StringBuilder sb2) {...}
Что интересно - при таком варианте возникает нагрузка на процессор порядка 20% (4 ядра), и само оно намертво виснет. Причем подавал на вход уже файл со 100 строками - он обработался мгновенно
Но что-то не так, мысли теряются что именно, потому что при отладке VS выводит следующее:
Помощник по отладке управляемого кода "ContextSwitchDeadlock" : "CLR не удалось перейти из COM-контекста 0x12467a8 в COM-контекст 0x12466f0 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций."
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
25.11.2020, 22:59
Georg Keneberg, ContextSwitchDeadlock не обязательно означает, что есть проблемы, при длительных операциях студия вас просто предупреждает, что возможно что-то не так. Можно либо отключить, либо игнорировать. Но вот что все зависает это действительно не очень хорошо. Вопрос кстати, а зачем вы в метод передаете стрингбилдер, сделайте его просто полем класса, в метод передавайте только данные. Еще покажите пожалуйста реализацию метода WriteToPTS. И за раз миллион строк это все-таки многовато на мой взгляд. Проблема еще может быть уже в самих методах расчета.

Добавлено через 15 минут
И кстати посмотрите в сторону async/await https://metanit.com/sharp/tutorial/13.3.php
0
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
25.11.2020, 23:40  [ТС]
Методика применявшаяся ранее (с одним StringBuilder) по скорости выглядит примерно так (если ставить counter = 500):
См. вложение
Я решил вернуться к истокам - с двумя StringBuilder, с ним хоть не было фатального падения скорости на перепрыгивании с операции чтения файла на расчет (а вот тут может все таки и стоит делать это в двух поточном режиме? когда 1 поток будет постоянно только читать файл, а другой - только считать и заносить в Builder?)
1. Запускаем процедуру чтения файла:
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
StringBuilder sb = new StringBuilder(); //Содержимое файла
    StringBuilder sb2 = new StringBuilder(); //Результат
private void Read_PTSFile()
    {
      long counter = 0;
      //Считаем строки файла
      foreach (var Line in File.ReadLines(openFileDialog1.FileName))
      {
        counter++;
        //double[] lineData = Line.Split(' ').Select(s => Convert.ToDouble(s)).ToArray(); // разбиваем строку в массив double
        sb.AppendLine(Line);
        
        if (counter % 500000 == 0)
        {
          CalcCSTransform(sb);
          WriteToPTS(sb2);
          sb.Clear();
          sb2.Clear();//Обнуляем
          counter = 0;
        }
      }
      //Если файл меньше или надо дозаписать остатки:
      CalcCSTransform(sb);
      WriteToPTS(sb2);
      sb.Clear();
      sb2.Clear();//Обнуляем
    }
2. Как выглядит модуль расчета
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void CalcCSTransform(StringBuilder sb)
    {
var reader = new StringReader(sb.ToString());
      while (reader.ReadLine() != null)
      { //string[] DataStrValues = DataStr.ToString().Split(new char[] { ' ' });
                //Инициация исходных данных
 
                double[] lineData = reader.ReadLine().Split(' ').Select(s => Convert.ToDouble(s)).ToArray();
        double CoordX = lineData[0];
        double CoordY = lineData[1];
        double CoordZ = lineData[2];
//Расчеты
        sb2.AppendLine($"{CoordX_2} {CoordY_2} {CoordZ}");
      }
    }
3. Как выгляди модуль записи в файл:
C#
1
2
3
4
5
6
7
    private void WriteToPTS(StringBuilder sb2)
    {
      using (StreamWriter SavePTSFile = new StreamWriter(saveFileDialog1.FileName, true, Encoding.ASCII))
      {
        SavePTSFile.Write(sb2.ToString());
        
      }
Теперь ошибка выдается на этапе чтения файла (что-то там не распознано, причем что интересно это происходит на строке №50 000 записываемого файла, а строка с данными (из меню отладки) располагается в старом где-то на позиции 110 000), такое впечатление что операции Clrar() теперь не проходят или проходят не так ...
Миниатюры
Передача значения метода цикла в другой метод и возврат обратно в цикл  
0
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
26.11.2020, 00:15  [ТС]
P.S.
Решил проблему обрабатывая механику разделения строки на double (Split (' ')) в теле расчетного метода.
C#
1
2
3
4
5
6
7
8
9
10
11
string DataStr = null;
      var reader = new StringReader(sb.ToString());
      while ((DataStr = reader.ReadLine()) != null)
      {
        //Инициация исходных данных
        string[] DataStrValues = DataStr.ToString().Split(new char[] { ' ' });
        //double[] lineData = reader.ReadLine().Split(' ').Select(s => Convert.ToDouble(s)).ToArray();
        double CoordX = Convert.ToDouble(DataStrValues[0]);
        double CoordY = Convert.ToDouble(DataStrValues[1]);
        double CoordZ = Convert.ToDouble(DataStrValues[2]);
...}
Установил counter 500000
Запустил на 680 Мб файле - обработалось минуты за 3. Меня это полностью устраивает пока что, ресурсов не потребляется особо. (см. вложение)
Спасибо всем!!! Пойду изучать запись сразу в бинарные файлы (формат облака точек типа .e57 к примеру...)
Миниатюры
Передача значения метода цикла в другой метод и возврат обратно в цикл  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
26.11.2020, 00:24
Цитата Сообщение от randok Посмотреть сообщение
Какой-нибудь качественный ssd с количеством операций ввода/вывода в полмиллиарда в секунду нагрузить будет сложно обычными задачами даже в многопоток.
Воще, не проблема.
И такие задачи часто встречаются.
Вычислительные возможности современных процессоров и современных SSD отличаются в сотни раз.
Не спорю, что задачи в которых узким местом является производительность процессора встречаются.
Но в границах данного раздела - мне такие темы встречались очень редко - раз-два за год..

В задаче же из этой темы требуется простейшее преобразование координат.
И издержки этого преобразования по сравнению с обращением к накопителю будут близки к нулю.
Конкретно эта задача будет упираться именно в оптимизацию работы с накопителем и ОЗУ.

Добавлено через 2 минуты
Цитата Сообщение от Georg Keneberg Посмотреть сообщение
Меня это полностью устраивает пока что
Ну, раз вас устраивает, значит всё ок.
0
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 47
26.11.2020, 00:31  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
раз вас устраивает
Скорее, устраивает на текущий момент*
Пойду переосмыслять сказанное вами
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
26.11.2020, 03:18
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Воще, не проблема.
Не, ну если так подходить к вопросу, то можно что угодно забить при желании, и память, и процессор Имелось ввиду разумное использование.

Georg Keneberg, попробуйте вместо
C#
1
2
3
4
using (StreamWriter SavePTSFile = new StreamWriter(saveFileDialog1.FileName, true, Encoding.ASCII))
      {
        SavePTSFile.Write(sb2.ToString());
      }
использовать
C#
1
File.AppendAllText(saveFileDialog1.FileName, sb2.ToString(), Encoding.ASCII);
должно быть немного быстрее. И вот тут
Цитата Сообщение от Georg Keneberg Посмотреть сообщение
var reader = new StringReader(sb.ToString());
надеюсь не забыли после всех действий reader.Close(), либо обернуть в using
C#
1
2
3
4
            using (var reader = new StringReader(sb.ToString()))
            {
                while (reader.ReadLine() != null)
                {
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16153 / 11274 / 2890
Регистрация: 21.04.2018
Сообщений: 33,152
Записей в блоге: 2
26.11.2020, 11:17
Цитата Сообщение от randok Посмотреть сообщение
Имелось ввиду разумное использование
Я же написал, что в том числе и для этой задачи.
И подобных задач встречается очень много: перерасчёт больших данных из одного файла в другой.
А для подобных задач большая вычислительная нагрузка, как в данной, как раз таки не характерна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2020, 11:17

Передача значения или параметра из одного метода в другой
Приветствую всех. Подскажите, как решить данную проблему. Мне нужно из метода CreateVector передать значение vector1 в метод ShowVector для...

Передача значения переменной из одного метода в другой и организация их параллельной работы
Здравствуйте. Есть две функции: function one() { var count=0; while(true) { count+=1; } }

Передача значения в другой метод
Друзья! Товарищи! Соратники! Застрял... :wall: Есть метод metod1: private void metod1() { ...

Передача переменной в функцию и возврат обратно
Доброго времени суток! По ходу выполнения скрипта, передаю переменную в функцию, делаю там необходимые манипуляции и через return возвращаю...

Цикл: есть ли какой-то метод вывода макс. и мин. значения цикла?
Здравствуйте, есть ли какой-то метод вывода макс. и мин. значения цикла?


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru