Реализовать асинхронные операции ввода-вывода файлов
Операции ввода и вывода файлов важны для многих приложений, что позволяет им читать и записывать файлы на жестком диске. В 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класс используются в приведенном примере для демонстрации асинхронных операций ввода-вывода файлов.