Загрузка данных
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}");
}
}