Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

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

#c_sharp #многопоточность


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

случайная дата за последние 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++;
                    }


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

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


Ответы

Ответ 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++; // потерял }

Комментариев нет:

Отправить комментарий