C#でファイル操作を非同期化する方法を徹底解説!async/awaitとFileStreamの基本
生徒
「C#でファイルを扱うときに、時間がかかってアプリが固まってしまうことがあるんですが、何か良い方法はありますか?」
先生
「ファイル操作はパソコンの処理の中でも特に時間がかかりやすいから、その間プログラムが止まってしまうことがあるね。そんなときは非同期処理を使うのが効果的なんだ。」
生徒
「非同期処理ってなんですか?名前は聞いたことがありますが、どういう仕組みなんでしょうか?」
先生
「非同期処理は、重い作業を裏側で進めながら、アプリ全体は止まらずに動き続けられる仕組みだよ。実際にC#で書きながら仕組みを見ていこう。」
1. C#の非同期処理とは?
C#の非同期処理は、asyncとawaitというキーワードを使って行います。この仕組みは、重い処理を実行している間でもプログラム全体が固まらないようにするためのものです。例えば、ファイルの読み込みや書き込みはデータ量によって大きく時間が変わり、その間アプリが反応しなくなることがあります。そこで非同期処理を使うと、処理が終わるまで待っている間も画面は動き続けるため、快適な動作を実現できます。
「非同期」という言葉は、作業を同時進行するイメージで、まるで料理をしながら洗濯機を動かすように、ひとつの作業が終わるのを待たずに別のことを進める仕組みです。ファイル操作のように時間がかかる処理は、この仕組みを使うことでアプリの使いやすさが大きく向上します。
2. FileStreamを使った非同期ファイル読み込み
まずは、FileStreamを使ってファイルを非同期で読み込む方法を紹介します。FileStreamはファイルを開いて読み書きを行うためのクラスです。このクラスは非同期用のメソッドを備えており、ReadAsyncを使うことで時間のかかる読み込み処理を裏側で進めてくれます。
以下に、テキストファイルを非同期で読み込むサンプルを示します。
using System.Text;
public async Task<string> ReadFileAsync(string path)
{
using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);
byte[] buffer = new byte[stream.Length];
await stream.ReadAsync(buffer, 0, buffer.Length);
return Encoding.UTF8.GetString(buffer);
}
ここで出てくるawaitは「終わるまで待つ」という意味ですが、待っている間もプログラム全体は止まりません。また、FileStreamの最後の引数をtrueにすることで、非同期モードが有効になります。
3. FileStreamを使った非同期ファイル書き込み
次は、ファイルに文字を書く処理を非同期で行う例です。書き込みも時間がかかる処理のため、非同期化することで画面が固まるのを防げます。
using System.Text;
public async Task WriteFileAsync(string path, string text)
{
using var stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true);
byte[] buffer = Encoding.UTF8.GetBytes(text);
await stream.WriteAsync(buffer, 0, buffer.Length);
}
このコードは指定した文字列をUTF-8形式でファイルに書き込みます。非同期メソッドのWriteAsyncを使うことで、高負荷の書き込み処理が別の流れで処理されるため、アプリの動作が軽快になります。
4. async/awaitのしくみを直感的に理解する
asyncとawaitは非常に便利な仕組みですが、初心者にとっては少しイメージしづらいかもしれません。ここでは日常の例えを使ってイメージをつかんでみましょう。
例えば、ご飯を炊いている間にずっと炊飯器の前で待つ必要はありませんよね。その時間を使って皿を洗ったり、掃除をしたりすることができます。炊けたら炊飯器が知らせてくれるので、次の作業に進めます。
非同期処理もこれと同じで、重い処理をしている間に別の作業を進められます。C#では、重い処理の完了をawaitで待つことができ、終わると結果が返ってきます。この仕組みが快適なアプリを作るうえでとても重要です。
5. 非同期化のメリットと注意点
非同期化を行うと、アプリが固まらずスムーズに動作するという大きなメリットがあります。特に、ファイル操作は大量のデータを扱うケースが多いため、非同期処理を利用すると体感的に動作が軽くなります。
ただし、気を付けるべきポイントもあります。複数の非同期処理を同時に実行すると、どの処理が先に終わるか予測しにくくなるため、データの順番が重要な場面では注意が必要です。また、ファイルへの同時書き込みが重なるとエラーになることもあるため、適切に制御することが大切です。