Создание и запись файлов через потоки

161
23 марта 2019, 18:30

Есть класс генерации строки определенного форамата:

случайная дата за последние 5 лет || случайный набор 10 латинских символов || случайный набор 10 русских символов || случайное положительное четное целочисленное число в диапазоне от 1 до 100 000 000 || случайное положительное число с 8 знаками после запятой в диапазоне от 1 до 20

Пример вывода:

03.03.2015||ZAwRbpGUiK||мДМЮаНкуКД||14152932||7,87742021||
23.01.2015||vgHKThbgrP||ЛДКХысХшЗЦ||35085588||8,49822372||
17.10.2017||AuTVNvaGRB||мЧепрИецрА||34259646||17,7248118||
24.09.2014||ArIAASwOnE||ЧпЙМдШлыфУ||23252734||14,6239438||
16.10.2017||eUkiAhUWmZ||ЗэЖЫзЯШАэШ||27831190||8,10838026||

Класс:

class GenFile
{
    public GenFile()
    {
    }
    private Random gen = new Random();
    private DateTime RandomDay()
    {
        DateTime start = new DateTime(2013, 1, 1);
        int range = (DateTime.Today - start).Days;
        return start.AddDays(gen.Next(range));
    }
    private string RandomString(string lang)
    {
        string data = null;
        const string engChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        const string rusChars = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
        if (lang == "eng")
        {
            data = new string(Enumerable.Repeat(engChars, 10)
              .Select(s => s[gen.Next(s.Length)]).ToArray());
        }
        else if (lang == "rus")
        {
            data = new string(Enumerable.Repeat(rusChars, 10)
              .Select(s => s[gen.Next(s.Length)]).ToArray());
        }
        return data;
    }
    private int RandomIntNumber()
    {
        int number;
        int min = 1;
        int max = 100000000;
        return number = (2 * gen.Next(min / 2, max / 2));
    }
    private double RandomDoubleNumber()
    {
        int min = 1;
        int max = 20;
        var next = gen.NextDouble();
        return min + (next * (max - min));
    }
    public override string ToString()
    {
        return (RandomDay().ToString("d") + "||" + RandomString("eng") + "||"
            + RandomString("rus") + "||" + RandomIntNumber() + "||"
            + RandomDoubleNumber().ToString("F8") + "||");
    }        
}

При создании через цикл 100 файлов и записи в них 100 000 этот процесс затягивается.

Как это делаю я (очень медленно):

GenFile genFile = new GenFile();
                    int i = 0;
                    while (i < 100)
                    {
                        int j = 0;
                        while (j < 100000)
                        {
                            File.AppendAllText(i + ".txt", genFile.ToString());
                            File.AppendAllText(i + ".txt", "\r\n");
                            j++;
                        }
                        i++;
                    }

Подскажите, а лучше покажите, как ускорить. С потоками никогда не работал. Пока не понимаю, как через потоки реализовать. И можно ли вообще.

Заранее спасибо.

Answer 1
  StringBuilder sb = new StringBuilder();
  int i = 0;
  while (i < 100)
  {
    sb.Clear();
    int j = 0;
    while (j < 100000)
    {
      sb.Append(genFile.ToString());
      sb.Append("\r\n");
      j++;
    }
    File.AppendAllText(i + ".txt", sb.ToString());
    i++;  // потерял 
  }
READ ALSO
C# System.Diagnostics.Process.GetProcessesByName ест много памяти

C# System.Diagnostics.Process.GetProcessesByName ест много памяти

У меня есть две программы которые просто проверяют наличие процессов друг-друга методом SystemDiagnostics

138
Xpath для HtmlAgilityPack C#

Xpath для HtmlAgilityPack C#

Есть такое код страницы:

146
Контрол на основе старого

Контрол на основе старого

Создаю контрол TabPage на основе старого:

132
Можно ли связать LuaJIT с C#?

Можно ли связать LuaJIT с C#?

Хотелось бы узнать, есть ли способ использовать библиотеку LuaJIT в программе, написанной на C# по аналогии с C/C++Т

141