非同期ファイルの入力と出力を実装する
ファイルの入力操作と出力操作は、多くのアプリケーションにとって不可欠であり、ハード ドライブ上のファイルの読み取りと書き込みを行えます。 C# では、ファイルの入力と出力 (ファイル I/O) を同期的または非同期的に実行できます。 非同期ファイル I/O は、特に、大きなファイルの読み取りやハード ドライブへのデータの書き込みなど、ファイル操作にかなりの時間がかかる場合に、アプリケーションのパフォーマンスと応答性を向上させるために特に役立ちます。
ファイルの読み取りと書き込みの非同期メソッドの作成
C# の async キーワードと await キーワードを使用すると、メイン スレッドをブロックすることなくファイル I/O 操作を実行できる非同期メソッドを作成できます。 これは、ユーザー インターフェイスを持つアプリケーションで特に便利です。メイン スレッドをブロックすると、フリーズまたは応答しない UI が発生する可能性があります。
System.IOおよびSystem.Text.Json名前空間は、ファイル I/O 操作を非同期的に実行するためのクラスとメソッドを提供します。
たとえば、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 キーワードを使用してこれらの非同期メソッドを呼び出す方法を示しています。
これにより、アプリケーションはメイン スレッドをブロックすることなくファイル I/O 操作を実行でき、パフォーマンスと応答性が向上します。 ディレクトリが存在しない場合は、 Directory.CreateDirectory メソッドを使用してディレクトリを作成し、ファイルを正常に書き込むことができます。
概要
このユニットでは、C# で非同期ファイルの入力操作と出力操作を実装する方法について説明しました。
asyncキーワードとawait キーワードを使用して、ファイルの読み取りと書き込みを行う非同期メソッドを作成する方法について説明しました。 これらの手法を使用すると、ファイル I/O 操作の実行時にアプリケーションのパフォーマンスと応答性を向上させることができます。
重要なポイント
- ファイルの入力操作と出力操作は、C# で同期的または非同期的に実行できます。
- 非同期ファイル I/O により、アプリケーションのパフォーマンスと応答性が向上します。
-
asyncキーワードとawaitキーワードは、ファイル I/O 操作の非同期メソッドを作成するために使用されます。 -
System.IOおよびSystem.Text.Json名前空間は、ファイル I/O 操作を非同期的に実行するためのクラスとメソッドを提供します。 - 指定した例では、
FileクラスとJsonSerializerクラスを使用して、非同期ファイル I/O 操作を示します。