カテゴリ: C# 更新日: 2026/06/14

C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法

C#のCancellationTokenを使ったキャンセル処理の実装方法
C#のCancellationTokenを使ったキャンセル処理の実装方法

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

生徒

「C#で時間のかかる処理を途中で止めることってできますか?」

先生

「できますよ。C#ではCancellationTokenを使うと、安全に処理を中断できます。」

生徒

「強制的に止めるんじゃなくて、安全に、というのはどういう意味ですか?」

先生

「それでは、キャンセル処理の考え方から順番に見ていきましょう。」

1. C#のキャンセル処理とは?

1. C#のキャンセル処理とは?
1. C#のキャンセル処理とは?

C#のキャンセル処理とは、実行中の処理を途中でやめたいときに使う仕組みです。 たとえば、ダウンロード中に「やっぱりやめたい」と思ったり、ボタンを押して長い処理を止めたい場面があります。

パソコン初心者の方は、電子レンジを想像してください。温め中に「止める」ボタンを押すと、安全に動作が止まります。 C#でも同じように、無理やり止めず、自分から止まる合図を送る方法が用意されています。

非同期プログラミングでは、この仕組みが特に重要です。強制終了はエラーや不具合の原因になるため、 CancellationTokenを使った安全なキャンセル処理が推奨されています。

2. CancellationTokenとCancellationTokenSourceの基本

2. CancellationTokenとCancellationTokenSourceの基本
2. CancellationTokenとCancellationTokenSourceの基本

キャンセル処理には、CancellationTokenとCancellationTokenSourceという 2つのクラスが登場します。

CancellationTokenSourceは「キャンセルしていいよ」という合図を出す人です。 CancellationTokenは、その合図を受け取るためのチケットのような存在です。

料理に例えると、CancellationTokenSourceが「もう調理をやめて」と言い、 CancellationTokenがそれを聞いてコンロの火を弱める役割になります。


CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

3. 非同期メソッドでキャンセルを受け取る

3. 非同期メソッドでキャンセルを受け取る
3. 非同期メソッドでキャンセルを受け取る

C#の非同期メソッドでは、asyncとawaitを使います。 キャンセル処理を行う場合、引数としてCancellationTokenを受け取ります。

処理の途中で「キャンセルされたかどうか」を確認し、自分から処理を終えるのがポイントです。


async Task LongTaskAsync(CancellationToken token)
{
    for (int i = 0; i < 5; i++)
    {
        token.ThrowIfCancellationRequested();
        await Task.Delay(1000);
        Console.WriteLine("処理中...");
    }
}

4. キャンセルを実行する方法

4. キャンセルを実行する方法
4. キャンセルを実行する方法

実際に処理を止めるには、CancellationTokenSourceのCancelメソッドを呼びます。 これは「もう止まっていいよ」と伝える操作です。


CancellationTokenSource cts = new CancellationTokenSource();

Task task = LongTaskAsync(cts.Token);

Thread.Sleep(2000);
cts.Cancel();

このようにすると、処理は次にキャンセル確認を行ったタイミングで終了します。 強制終了ではないため、プログラムが不安定になりにくいのが特徴です。

5. OperationCanceledExceptionとは?

5. OperationCanceledExceptionとは?
5. OperationCanceledExceptionとは?

ThrowIfCancellationRequestedが呼ばれると、 OperationCanceledExceptionという例外が発生します。

例外と聞くと難しく感じますが、「処理を中断した」という合図のようなものです。 エラーではなく、想定された動きなので安心してください。


try
{
    await LongTaskAsync(cts.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("キャンセルされました。");
}

6. CancellationTokenを使うメリット

6. CancellationTokenを使うメリット
6. CancellationTokenを使うメリット

CancellationTokenを使う最大のメリットは、安全で読みやすいコードになることです。 処理を止めるタイミングを自分で決められるため、途中のデータが壊れる心配がありません。

また、非同期処理やTaskと組み合わせることで、実際のアプリケーション開発でもよく使われています。 ダウンロード処理、ファイル操作、通信処理など、幅広い場面で活躍します。

C#の非同期プログラミングを学ぶ上で、CancellationTokenは避けて通れない重要な要素です。

まとめ

まとめ
まとめ

今回の記事では、C#のCancellationTokenを使ったキャンセル処理について、初心者の方でも理解できるように基本から順番に解説してきました。C#の非同期プログラミングでは、処理の途中で作業を中断したい場面がよくあります。たとえば長時間のファイル読み込み、ネットワーク通信、ダウンロード処理、大量データの計算処理などです。これらの処理はすぐに終わるとは限らないため、ユーザーが途中で処理を止めたいと考えることがあります。そのような場面で役立つのがC#のCancellationTokenを使ったキャンセル処理です。

C#のCancellationTokenは、非同期処理やTaskを使った処理を安全に停止するための仕組みとして用意されています。プログラムの処理を無理やり停止すると、途中のデータが壊れたり、メモリの状態が不安定になったりする可能性があります。しかしCancellationTokenを使えば、処理側がキャンセルの合図を確認し、自分のタイミングで安全に処理を終了できます。これにより、安定したC#アプリケーションを作ることができます。

C#のキャンセル処理では、CancellationTokenSourceとCancellationTokenという二つの重要なクラスが登場します。CancellationTokenSourceはキャンセルの合図を送る役割を持ち、CancellationTokenはその合図を受け取る役割を持っています。この二つを組み合わせることで、プログラムの中で柔軟に処理の停止を管理することができます。


CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

上記のようにCancellationTokenSourceからCancellationTokenを取得することで、キャンセル処理の準備が整います。このトークンを非同期メソッドに渡すことで、処理の途中でキャンセルの状態を確認することができます。C#の非同期処理では、asyncとawaitを使ったTaskベースのプログラミングが一般的です。そのためCancellationTokenは、非同期メソッドの引数として渡されることが多くあります。

非同期処理の中では、一定のタイミングでキャンセルされたかどうかを確認します。C#ではThrowIfCancellationRequestedというメソッドを使うことで、キャンセルが要求された場合に処理を中断できます。この仕組みにより、プログラムは安全な状態で処理を終了できます。


async Task LongTaskAsync(CancellationToken token)
{
    for (int i = 0; i < 5; i++)
    {
        token.ThrowIfCancellationRequested();
        await Task.Delay(1000);
        Console.WriteLine("処理中...");
    }
}

このようなC#の非同期メソッドでは、処理の途中でキャンセルが発生していないかを確認しながら進めます。キャンセルが要求されるとOperationCanceledExceptionという例外が発生しますが、これはエラーではなく処理が正常に中断されたことを示すものです。C#の例外処理を使って、この状態をきちんと受け取ることが重要です。


try
{
    await LongTaskAsync(cts.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("キャンセルされました。");
}

キャンセルされました。

このようにC#のCancellationTokenを使うことで、非同期処理のキャンセルを安全に管理できます。特にTaskを使った処理では、キャンセル処理を正しく実装しておくことで、ユーザー体験の良いアプリケーションを作ることができます。例えばボタン操作で処理を中断するアプリケーションや、通信が長く続いたときに処理を停止する仕組みなど、さまざまな場面でCancellationTokenは活躍します。

また、C#の非同期プログラミングでは、処理の管理がとても重要になります。複数の処理が同時に動く場合、どのタイミングで処理を停止するのかを適切に制御する必要があります。CancellationTokenを利用すれば、プログラム全体の処理を整理しながら、安全で読みやすいコードを書くことができます。これからC#を使ってアプリケーション開発を行う方にとって、CancellationTokenの理解は非常に重要です。

今回学んだ内容をまとめると、C#のCancellationTokenは非同期処理を安全に停止するための仕組みであり、CancellationTokenSourceがキャンセルの合図を出し、CancellationTokenがその合図を受け取るという役割を持っています。処理の途中ではキャンセルが要求されたかどうかを確認し、必要に応じてOperationCanceledExceptionを使って処理を終了します。この一連の流れを理解することで、C#の非同期プログラミングをより安全に実装できるようになります。

C#のプログラミング学習では、async、await、Task、そしてCancellationTokenといった非同期処理の基本を一緒に理解することが大切です。これらの仕組みを正しく使いこなすことで、安定したアプリケーションや高速な処理を実現できます。特に実務の開発では、長時間の処理を安全に停止する機能は非常に重要になるため、CancellationTokenの知識は必ず役立つでしょう。

先生と生徒の振り返り会話

生徒

C#のCancellationTokenを使うと、実行中の処理を安全に止められるということがよく分かりました。強制的に止めるのではなく、処理が自分で止まる仕組みなんですね。

先生

その通りです。C#の非同期処理では、安全に処理を中断することがとても重要です。CancellationTokenを使えば、プログラムの状態を保ったまま処理を停止できます。

生徒

CancellationTokenSourceとCancellationTokenの役割も理解できました。合図を出す人と、それを受け取るチケットのような関係なんですね。

先生

はい、その理解で大丈夫です。C#の非同期プログラミングでは、この二つのクラスを組み合わせてキャンセル処理を実装します。

生徒

処理の途中でThrowIfCancellationRequestedを使ってキャンセルを確認する仕組みも分かりました。これなら安全に止められそうです。

先生

その通りです。C#ではTaskやasyncと一緒にCancellationTokenを使うことで、安定した非同期処理を書くことができます。これからC#のプログラミングを続ける中で、何度も登場する大切な仕組みなので、ぜひ覚えておいてください。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#で長時間の処理を途中で止めたいときは、どのような方法を使えばよいのでしょうか。CancellationTokenを使ったキャンセル処理の基本的な考え方を初心者向けに教えてください。

C#では非同期処理やTaskを使った処理の途中で作業を中断したい場合に、CancellationTokenを使ったキャンセル処理を利用します。CancellationTokenは処理を強制終了するのではなく、処理の中でキャンセル要求を確認して安全に停止する仕組みです。非同期プログラミングでは、長時間の処理やダウンロード処理、ファイル処理、通信処理などが発生するため、CancellationTokenを使った安全なキャンセル処理がとても重要になります。
カテゴリの一覧へ
新着記事
New1
COBOL
COBOLのREAD文を完全マスター!初心者でもわかるレコードの読み込み方法
New2
COBOL
COBOLのCALL文の基本構文とパラメータ渡しを完全ガイド!初心者向けにやさしく解説
New3
C#
C# CLIツール開発入門!Processクラスで外部コマンドを実行する方法
New4
Azure
Azure Load Balancerで高可用性を実現!負荷分散の仕組みと構築手順を徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のthisキーワードとは?現在のオブジェクトを指す仕組みをわかりやすく解説!
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.4
Java&Spring記事人気No4
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本
No.5
Java&Spring記事人気No5
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.6
Java&Spring記事人気No6
COBOL
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.7
Java&Spring記事人気No7
COBOL
COBOLのコンパイルエラーの原因と対処法を完全ガイド!初心者でもわかる基本のキホン
No.8
Java&Spring記事人気No8
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド