Реализовать асинхронные операции ввода-вывода файлов

Завершено

Операции ввода и вывода файлов важны для многих приложений, что позволяет им читать и записывать файлы на жестком диске. В C#входные и выходные данные файлов (операции ввода-вывода) можно выполнять синхронно или асинхронно. Асинхронный ввод-вывод файлов особенно полезен для повышения производительности и реагирования приложений, особенно в сценариях, когда операции с файлами могут занять значительное время, например чтение больших файлов или запись данных на жесткий диск.

Создание асинхронных методов для чтения и записи файлов

Ключевые слова async и await в C# позволяют создавать асинхронные методы, которые могут выполнять файловые операции ввода-вывода, не блокируя основной поток. Это особенно полезно в приложениях с пользовательским интерфейсом, где блокировка основного потока может привести к замороженному или неответственному пользовательскому интерфейсу. Пространства имен System.IO и System.Text.Json предоставляют классы и методы для асинхронного выполнения операций файлового ввода-вывода.

Например, File класс в System.IO пространстве имен предоставляет методы для асинхронного чтения и записи файлов. Метод File.ReadAllTextAsync асинхронно считывает содержимое файла, а File.WriteAllTextAsync метод записывает текст в файл асинхронно. Эти методы возвращают Task<string> или Task, которые представляют асинхронную операцию, позволяя использовать ключевое слово await для ожидания их завершения без блокировки вызывающего потока.

В пространстве имен System.Text.Json класс JsonSerializer предоставляет асинхронные методы для сериализации и десериализации данных JSON. Метод JsonSerializer.SerializeAsync сериализует объект в строку JSON асинхронно, а JsonSerializer.DeserializeAsync метод десериализирует строку JSON в объект асинхронно. Эти методы также возвращают Task, который представляет асинхронную операцию.

В следующем примере кода показано, как создать асинхронные методы, сериализующие объект C#, записывать строку JSON в файл, считывать содержимое файла в строку и десериализировать строку JSON обратно в объект C#:


using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;

public class Account
{
    public string Name { get; set; }
    public decimal Balance { get; set; }
}

public class Program
{
    public static async Task Main()
    {
        // Combine a directory and file name, then create the directory if it doesn't exist
        string directoryPath = @"C:\TempDir";
        if (!Directory.Exists(directoryPath))
        {
            Directory.CreateDirectory(directoryPath);
        }

        string fileName = "account.json";
        string filePath = Path.Combine(directoryPath, fileName);

        Account account = new Account { Name = "Elize Harmsen", Balance = 1000.00m };

        // Save account data to a file asynchronously
        await SaveAccountDataAsync(filePath, account);

        // Load account data from the file asynchronously
        Account loadedAccount = await LoadAccountDataAsync(filePath);
        Console.WriteLine($"Name: {loadedAccount.Name}, Balance: {loadedAccount.Balance}");
    }

    public static async Task SaveAccountDataAsync(string filePath, Account account)
    {
        string jsonString = JsonSerializer.Serialize(account);
        await File.WriteAllTextAsync(filePath, jsonString);
    }

    public static async Task<Account> LoadAccountDataAsync(string filePath)
    {
        string jsonString = await File.ReadAllTextAsync(filePath);
        return JsonSerializer.Deserialize<Account>(jsonString);
    }
}

В этом примере SaveAccountDataAsync метод сериализует Account объект в строку JSON и записывает его в файл асинхронно. Метод LoadAccountDataAsync считывает строку JSON из файла и десериализирует ее обратно в Account объект асинхронно. Метод Main демонстрирует, как вызывать эти асинхронные методы с помощью ключевого await слова.

Это позволяет приложению выполнять операции ввода-вывода файлов, не блокируя основной поток, повышая производительность и скорость реагирования. Метод Directory.CreateDirectory используется для создания каталога, если он не существует, гарантируя успешность записи файла.

Сводка

В этом уроке вы узнали, как реализовать асинхронные операции ввода и вывода файлов в C#. Вы изучили использование ключевых слов async и await для создания асинхронных методов чтения и записи файлов. С помощью этих методов можно повысить производительность и скорость реагирования приложений при выполнении операций ввода-вывода файлов.

Ключевые моменты

  • Операции ввода и вывода файлов можно выполнять синхронно или асинхронно в C#.
  • Асинхронный ввод-вывод файлов повышает производительность приложения и скорость реагирования.
  • Ключевые слова async и await используются для создания асинхронных методов для операций ввода-вывода файлов.
  • Пространства имен System.IO и System.Text.Json предоставляют классы и методы для асинхронного выполнения операций файлового ввода-вывода.
  • Класс File и JsonSerializer класс используются в приведенном примере для демонстрации асинхронных операций ввода-вывода файлов.