Загрузка данных


using System;
using System.IO;
using System.Threading.Tasks;
using System.Linq;

class AsyncFileDemo
{
    static async Task Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8;

        // Подготовим тестовые файлы для демонстрации
        PrepareTestFiles();

        // Задание 1: асинхронное чтение файла + работа в основном потоке
        await Task1_AsyncReadWithMainWork();

        // Задание 2: асинхронная запись + статус в основном потоке
        await Task2_AsyncWriteWithStatus();

        // Задание 3: параллельное асинхронное чтение нескольких файлов
        await Task3_ParallelReadMultipleFiles();

        // Задание 4: цепочка асинхронных задач (чтение -> обработка -> запись)
        await Task4_AsyncPipeline();

        Console.WriteLine("\nВсе задания выполнены. Нажмите любую клавишу...");
        Console.ReadKey();
    }

    // Создаём тестовые текстовые файлы
    static void PrepareTestFiles()
    {
        File.WriteAllText("file1.txt", "Привет, мир!\nЭто первая строка.\nИ ещё одна.");
        File.WriteAllText("file2.txt", "Асинхронность в C# — это просто.\nParallel tasks rock!");
        File.WriteAllText("file3.txt", "Lorem ipsum dolor sit amet.\nConsectetur adipiscing elit.");
    }

    // 1. Асинхронное чтение файла, а в основном потоке выводится сообщение
    static async Task Task1_AsyncReadWithMainWork()
    {
        Console.WriteLine("\n=== ЗАДАНИЕ 1 ===");
        
        // Запускаем асинхронное чтение файла
        Task<string> readTask = File.ReadAllTextAsync("file1.txt");
        
        // Пока файл читается, основной поток выполняет другую работу
        Console.WriteLine("Основной поток: вывод сообщения во время чтения файла...");
        for (int i = 0; i < 3; i++)
        {
            await Task.Delay(100); // имитация полезной работы
            Console.WriteLine($"Основной поток: сообщение {i + 1}");
        }
        
        // Ждём завершения чтения и выводим содержимое
        string content = await readTask;
        Console.WriteLine($"Содержимое файла:\n{content}");
    }

    // 2. Асинхронная запись данных в файл, а основной поток выводит статус
    static async Task Task2_AsyncWriteWithStatus()
    {
        Console.WriteLine("\n=== ЗАДАНИЕ 2 ===");
        
        string data = "Это данные для асинхронной записи.\nСтрока 2.\nСтрока 3.";
        
        // Запускаем асинхронную запись
        Task writeTask = File.WriteAllTextAsync("output.txt", data);
        
        // В основном потоке выводим статус операции каждые 100 мс
        while (!writeTask.IsCompleted)
        {
            Console.WriteLine("Основной поток: запись ещё выполняется...");
            await Task.Delay(100);
        }
        Console.WriteLine("Основной поток: запись завершена!");
        
        // Проверим результат
        string written = await File.ReadAllTextAsync("output.txt");
        Console.WriteLine($"Проверка записи:\n{written}");
    }

    // 3. Асинхронное чтение нескольких файлов параллельно
    static async Task Task3_ParallelReadMultipleFiles()
    {
        Console.WriteLine("\n=== ЗАДАНИЕ 3 ===");
        
        string[] fileNames = { "file1.txt", "file2.txt", "file3.txt" };
        
        // Запускаем все чтения параллельно
        Task<string>[] readTasks = fileNames.Select(file => File.ReadAllTextAsync(file)).ToArray();
        
        // Ждём завершения всех
        string[] contents = await Task.WhenAll(readTasks);
        
        // Выводим содержимое каждого файла
        for (int i = 0; i < fileNames.Length; i++)
        {
            Console.WriteLine($"\n--- {fileNames[i]} ---");
            Console.WriteLine(contents[i]);
        }
    }

    // 4. Комплексная асинхронная обработка: чтение -> обработка -> запись
    static async Task Task4_AsyncPipeline()
    {
        Console.WriteLine("\n=== ЗАДАНИЕ 4 ===");
        
        // Этап 1: асинхронное чтение исходного файла
        string sourceFile = "file1.txt";
        string content = await File.ReadAllTextAsync(sourceFile);
        Console.WriteLine($"Этап 1: файл '{sourceFile}' прочитан. Размер: {content.Length} символов.");
        
        // Этап 2: асинхронная обработка данных (имитация - подсчёт слов)
        await Task.Delay(100); // имитация сложной обработки
        int wordCount = content.Split(new char[] { ' ', '\n', '\r', '\t' }, StringSplitOptions.RemoveEmptyEntries).Length;
        Console.WriteLine($"Этап 2: обработка завершена. Количество слов: {wordCount}");
        
        // Этап 3: асинхронная запись результата
        string result = $"В файле '{sourceFile}' найдено слов: {wordCount}";
        await File.WriteAllTextAsync("result.txt", result);
        Console.WriteLine($"Этап 3: результат записан в файл 'result.txt'.");
        
        // Покажем итог
        string finalResult = await File.ReadAllTextAsync("result.txt");
        Console.WriteLine($"Итоговый результат: {finalResult}");
    }
}