カテゴリ: C# 更新日: 2025/11/19

C#でファイル操作を非同期化する方法を徹底解説!async/awaitとFileStreamの基本

C#でファイル操作を非同期化する方法(async/await・FileStream)
C#でファイル操作を非同期化する方法(async/await・FileStream)

先生と生徒の会話形式で理解しよう

生徒

「C#でファイルを扱うときに、時間がかかってアプリが固まってしまうことがあるんですが、何か良い方法はありますか?」

先生

「ファイル操作はパソコンの処理の中でも特に時間がかかりやすいから、その間プログラムが止まってしまうことがあるね。そんなときは非同期処理を使うのが効果的なんだ。」

生徒

「非同期処理ってなんですか?名前は聞いたことがありますが、どういう仕組みなんでしょうか?」

先生

「非同期処理は、重い作業を裏側で進めながら、アプリ全体は止まらずに動き続けられる仕組みだよ。実際にC#で書きながら仕組みを見ていこう。」

1. C#の非同期処理とは?

1. C#の非同期処理とは?
1. C#の非同期処理とは?

C#の非同期処理は、asyncawaitというキーワードを使って行います。この仕組みは、重い処理を実行している間でもプログラム全体が固まらないようにするためのものです。例えば、ファイルの読み込みや書き込みはデータ量によって大きく時間が変わり、その間アプリが反応しなくなることがあります。そこで非同期処理を使うと、処理が終わるまで待っている間も画面は動き続けるため、快適な動作を実現できます。

「非同期」という言葉は、作業を同時進行するイメージで、まるで料理をしながら洗濯機を動かすように、ひとつの作業が終わるのを待たずに別のことを進める仕組みです。ファイル操作のように時間がかかる処理は、この仕組みを使うことでアプリの使いやすさが大きく向上します。

2. FileStreamを使った非同期ファイル読み込み

2. FileStreamを使った非同期ファイル読み込み
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を使った非同期ファイル書き込み

3. FileStreamを使った非同期ファイル書き込み
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のしくみを直感的に理解する

4. async/awaitのしくみを直感的に理解する
4. async/awaitのしくみを直感的に理解する

asyncawaitは非常に便利な仕組みですが、初心者にとっては少しイメージしづらいかもしれません。ここでは日常の例えを使ってイメージをつかんでみましょう。

例えば、ご飯を炊いている間にずっと炊飯器の前で待つ必要はありませんよね。その時間を使って皿を洗ったり、掃除をしたりすることができます。炊けたら炊飯器が知らせてくれるので、次の作業に進めます。

非同期処理もこれと同じで、重い処理をしている間に別の作業を進められます。C#では、重い処理の完了をawaitで待つことができ、終わると結果が返ってきます。この仕組みが快適なアプリを作るうえでとても重要です。

5. 非同期化のメリットと注意点

5. 非同期化のメリットと注意点
5. 非同期化のメリットと注意点

非同期化を行うと、アプリが固まらずスムーズに動作するという大きなメリットがあります。特に、ファイル操作は大量のデータを扱うケースが多いため、非同期処理を利用すると体感的に動作が軽くなります。

ただし、気を付けるべきポイントもあります。複数の非同期処理を同時に実行すると、どの処理が先に終わるか予測しにくくなるため、データの順番が重要な場面では注意が必要です。また、ファイルへの同時書き込みが重なるとエラーになることもあるため、適切に制御することが大切です。

カテゴリの一覧へ
新着記事
C#でタイムスタンプの精度を上げるためのテクニックを徹底解説!(初心者向け)
C#のコーディング規約(C# Coding Conventions)とは?読みやすいコードを書くための基本ルール
C#のデストラクタ(ファイナライザ)の使い方と注意点をやさしく解説!
COBOL資産のバージョン管理とは?初心者でもわかる保守と管理の基本
人気記事
No.1
Java&Spring記事人気No1
COBOLで学ぶSELECT文のORDER BY・GROUP BY活用法!初心者でもわかるデータ集計
No.2
Java&Spring記事人気No2
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.4
Java&Spring記事人気No4
COBOLで学ぶカーソル操作と複数行データ取得の基本
No.5
Java&Spring記事人気No5
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方
No.7
Java&Spring記事人気No7
C#の数値型をマスターしよう!int・double・decimalの違いと使い方
No.8
Java&Spring記事人気No8
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド