フッターコンテンツにスキップ
.NETヘルプ

C# Cancellationtoken(開発者向けの仕組み)

現代のソフトウェア開発において、特に大規模または複雑なPDFファイルの生成が一般的なアプリケーションでは、長時間実行されるタスクを効率的に管理することが重要です。 C#開発者は、シームレスなPDF作成のためにIronPDFに頼ることがよくありますが、潜在的に長時間に渡るPDF生成タスクを処理するには、ユーザーの中断やキャンセルを管理する方法が必要です。

ここでC#のCancellationTokenが登場します。 IronPDFと統合することで、PDF生成タスクを高応答かつ効率的にすることができます。 この記事では、CancellationTokenの重要性、そのIronPDFとの相性の良さ、タスクを優雅にキャンセルするための実装方法について探ります。

C#におけるCancellationTokenとは何ですか?

CancellationTokenは、C#における非同期プログラミングの基本的な部分です。 それは、タスクがキャンセルされるべきであることを示すことができ、開発者に長時間にわたる操作のより大きなコントロールを与えます。 これは特に、目標量に達するまでデータから動的レポートを継続的に生成したいような、レポートや請求書の作成などのタスクを実行する際に役立ちます。この時点で操作がキャンセルされるべきであることを示すためにC#キャンセレーショントークンを使用し、プログラムを優雅に終了させます。

それはどのように機能しますか?

本質的に、CancellationTokenはタスクやメソッドに渡され、キャンセルの要求が出されているかどうかを定期的にチェックします。 もしそうであれば、タスクは優雅に終了することができ、リソースを解放し、アプリケーションの応答性を向上させます。 特にPDF生成のようなケースで役立ちます。複雑なドキュメントの作成には時間がかかることがあります。

CancellationTokensを使用することで、不要に長く実行されるタスクの潜在的な欠点を回避できます。これには、無駄なシステムリソースや悪いユーザーエクスペリエンスが含まれます。

内部キャンセレーショントークン

C#において、内部キャンセレーショントークンとは、特定のクラスやメソッド内で作成され、管理されるキャンセレーショントークンを指します。外部ソースから渡されるわけではありません。 これは、単一のコンポーネントの範囲内でのタスクキャンセルのより細かいコントロールを可能にし、内部から発生するキャンセル要求を監視しレスポンスすることを可能にします。

内部キャンセレーショントークンを使用することは、キャンセルロジックをクラスの利用者に公開せずにカプセル化したいシナリオで特に有用です。これによりクリーンなインターフェースを維持できます。 このアプローチは、コードのモジュール性を向上させ、複雑な非同期ワークフローを管理しやすくする一方で、広範なCancellationTokenフレームワークによる柔軟性を活用できます。

IronPDFでキャンセレーショントークンを使う理由は?

特にWebアプリケーションや複雑なレポートシステムでPDFを生成する場合、大きなPDFファイルを作成するタスクをユーザーが開始するが、その後で画面を離れたり結果を不要としたりする状況に遭遇するかもしれません。 このような場合、PDF生成プロセスをキャンセルしてサーバーやUIに不要な負荷をかけないようにしたいものです。

以下がIronPDFCancellationTokenを使用することが重要な理由です:

1. 不要な負荷を防ぐ

ユーザーが依頼したPDFを必要としなくなった場合、そのプロセスを続行する理由はありません。 CancellationTokenを利用することで、PDF生成タスクを停止し、サーバーへの余分な負荷を防ぎ、アプリケーションの全体的なパフォーマンスを改善することができます。

2. ユーザーエクスペリエンスの向上

デスクトップアプリケーションでは、PDF生成がUIスレッド上で行われ、タスクが長時間にわたる場合、ユーザーインターフェースがロックされることがあります。 CancellationTokenを組み込むことで、ユーザーがタスクをキャンセルし、アプリケーションの応答性を保つことができます。

3. スケーラビリティの向上

多数のユーザーが同時にPDFを生成するWebアプリケーションにおいて、スケーラビリティが鍵となります。 CancellationTokenは、不要なタスクを安全にキャンセルし、他のリクエストを効率的に処理するためのリソースを解放することができます。

IronPDFでのCancellationToken実装方法

CancellationTokenが有用である理由がわかったので、IronPDFとの実装方法を説明します。

ステップ1:プロジェクトにIronPDFを設定する

IronPDFを使用開始するには、まずインストールする必要があります。 すでにインストールされている場合は、次のセクションに進むことができます。 それ以外の場合は、以下の手順でIronPDFライブラリをインストールします。

NuGetパッケージマネージャコンソールを通じて

NuGet パッケージ マネージャー コンソールを使用してIronPDFをインストールするには、Visual Studioを開き、パッケージ マネージャー コンソールに移動します。 次に、以下のコマンドを実行してください:

Install-Package IronPdf

NuGetパッケージマネージャ for Solutionを通じて

Visual Studioを開き、「ツール -> NuGetパッケージマネージャ -> NuGetパッケージの管理」へ進み、IronPDFを検索します。 ここでは、プロジェクトを選択して「インストール」をクリックするだけで、IronPDFがプロジェクトに追加されます。

IronPDFをインストールしたら、コードの先頭に正しい using ステートメントを追加するだけでIronPDFの使用を開始できます。

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

ステップ2: 非同期PDF生成メソッドでキャンセレーショントークンを使用する

実際の実装に取り組みましょう。 この例では、IronPDFを使用してHTMLからシンプルなPDFを生成します。しかし、CancellationTokenを使用して、必要に応じてタスクをキャンセルできるようにします。

using IronPdf;
using System;
using System.Threading;
using System.Threading.Tasks;

public class PdfGenerator
{
    public async Task GeneratePdfWithCancellation(CancellationToken token)
    {
        var Renderer = new ChromePdfRenderer();
        try
        {
            // Check for cancellation before starting
            token.ThrowIfCancellationRequested();

            // Simulating a long task that can be checked for cancellation periodically
            for (int i = 0; i < 10; i++)
            {
                // Simulating a piece of work (this could be part of a larger HTML rendering)
                await Task.Delay(500); // Simulate chunk processing

                // Periodically check for cancellation in long-running operations
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Cancellation requested. Throwing exception.");
                    token.ThrowIfCancellationRequested();  // This will trigger an OperationCanceledException
                }
            }

            // Simulate PDF creation after the long process
            var pdf = await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>");

            // Save the PDF after ensuring no cancellation occurred
            pdf.SaveAs("output.pdf");
            Console.WriteLine("PDF generated successfully.");
        }
        catch (OperationCanceledException)
        {
            // Handle task cancellation
            Console.WriteLine("PDF generation was canceled.");
        }
        catch (Exception ex)
        {
            // Handle other exceptions
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource
        var cancellationTokenSource = new CancellationTokenSource();

        // Create our cancellation token
        var token = cancellationTokenSource.Token;

        // Start the PDF generation task
        var pdfGenerator = new PdfGenerator();
        Task pdfTask = pdfGenerator.GeneratePdfWithCancellation(token);

        // Simulate a cancellation scenario
        Console.WriteLine("Press any key to cancel PDF generation...");
        Console.ReadKey();

        // Cancel the task by calling Cancel() on the CancellationTokenSource
        cancellationTokenSource.Cancel();

        try
        {
            // Await the task to handle any exceptions, such as cancellation
            await pdfTask;
        }
        catch (OperationCanceledException)
        {
            // Confirm the cancellation
            Console.WriteLine("The PDF generation was canceled.");
        }
        finally
        {
            cancellationTokenSource.Dispose();
        }

        Console.WriteLine("Program finished.");
    }
}
using IronPdf;
using System;
using System.Threading;
using System.Threading.Tasks;

public class PdfGenerator
{
    public async Task GeneratePdfWithCancellation(CancellationToken token)
    {
        var Renderer = new ChromePdfRenderer();
        try
        {
            // Check for cancellation before starting
            token.ThrowIfCancellationRequested();

            // Simulating a long task that can be checked for cancellation periodically
            for (int i = 0; i < 10; i++)
            {
                // Simulating a piece of work (this could be part of a larger HTML rendering)
                await Task.Delay(500); // Simulate chunk processing

                // Periodically check for cancellation in long-running operations
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Cancellation requested. Throwing exception.");
                    token.ThrowIfCancellationRequested();  // This will trigger an OperationCanceledException
                }
            }

            // Simulate PDF creation after the long process
            var pdf = await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>");

            // Save the PDF after ensuring no cancellation occurred
            pdf.SaveAs("output.pdf");
            Console.WriteLine("PDF generated successfully.");
        }
        catch (OperationCanceledException)
        {
            // Handle task cancellation
            Console.WriteLine("PDF generation was canceled.");
        }
        catch (Exception ex)
        {
            // Handle other exceptions
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource
        var cancellationTokenSource = new CancellationTokenSource();

        // Create our cancellation token
        var token = cancellationTokenSource.Token;

        // Start the PDF generation task
        var pdfGenerator = new PdfGenerator();
        Task pdfTask = pdfGenerator.GeneratePdfWithCancellation(token);

        // Simulate a cancellation scenario
        Console.WriteLine("Press any key to cancel PDF generation...");
        Console.ReadKey();

        // Cancel the task by calling Cancel() on the CancellationTokenSource
        cancellationTokenSource.Cancel();

        try
        {
            // Await the task to handle any exceptions, such as cancellation
            await pdfTask;
        }
        catch (OperationCanceledException)
        {
            // Confirm the cancellation
            Console.WriteLine("The PDF generation was canceled.");
        }
        finally
        {
            cancellationTokenSource.Dispose();
        }

        Console.WriteLine("Program finished.");
    }
}
Imports IronPdf
Imports System
Imports System.Threading
Imports System.Threading.Tasks

Public Class PdfGenerator
	Public Async Function GeneratePdfWithCancellation(ByVal token As CancellationToken) As Task
		Dim Renderer = New ChromePdfRenderer()
		Try
			' Check for cancellation before starting
			token.ThrowIfCancellationRequested()

			' Simulating a long task that can be checked for cancellation periodically
			For i As Integer = 0 To 9
				' Simulating a piece of work (this could be part of a larger HTML rendering)
				Await Task.Delay(500) ' Simulate chunk processing

				' Periodically check for cancellation in long-running operations
				If token.IsCancellationRequested Then
					Console.WriteLine("Cancellation requested. Throwing exception.")
					token.ThrowIfCancellationRequested() ' This will trigger an OperationCanceledException
				End If
			Next i

			' Simulate PDF creation after the long process
			Dim pdf = Await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>")

			' Save the PDF after ensuring no cancellation occurred
			pdf.SaveAs("output.pdf")
			Console.WriteLine("PDF generated successfully.")
		Catch e1 As OperationCanceledException
			' Handle task cancellation
			Console.WriteLine("PDF generation was canceled.")
		Catch ex As Exception
			' Handle other exceptions
			Console.WriteLine($"An error occurred: {ex.Message}")
		End Try
	End Function
End Class

Public Class Program
	Public Shared Async Function Main(ByVal args() As String) As Task
		' Create a CancellationTokenSource
		Dim cancellationTokenSource As New CancellationTokenSource()

		' Create our cancellation token
		Dim token = cancellationTokenSource.Token

		' Start the PDF generation task
		Dim pdfGenerator As New PdfGenerator()
		Dim pdfTask As Task = pdfGenerator.GeneratePdfWithCancellation(token)

		' Simulate a cancellation scenario
		Console.WriteLine("Press any key to cancel PDF generation...")
		Console.ReadKey()

		' Cancel the task by calling Cancel() on the CancellationTokenSource
		cancellationTokenSource.Cancel()

		Try
			' Await the task to handle any exceptions, such as cancellation
			Await pdfTask
		Catch e1 As OperationCanceledException
			' Confirm the cancellation
			Console.WriteLine("The PDF generation was canceled.")
		Finally
			cancellationTokenSource.Dispose()
		End Try

		Console.WriteLine("Program finished.")
	End Function
End Class
$vbLabelText   $csharpLabel

コンソール出力

C#キャンセレーショントークン(開発者向けの動作方法):図2 - コンソール出力

PDF 出力

C#キャンセレーショントークン(開発者向けの動作方法):図3 - PDF出力

この例では、CancellationTokenをC#プログラムで使用して、IronPDFを使用した長時間実行されるPDF生成タスクをキャンセルする方法を示します。 コードは2つの部分に分かれて構成されています:PDF生成プロセス(PdfGeneratorクラス)とメインプログラムロジック(Programクラス)。

  • クラスPdfGenerator:このクラスには、CancellationTokenを通じてキャンセルをサポートしつつ、PDFファイル生成をシミュレートするメソッドが含まれています。
  • メインメソッドで、CancellationTokenSource()を使用してキャンセレーショントークンソースを作成し、その後、CancellationTokenSourceのトークンプロパティを渡すことでトークンオブジェクトを作成します。
  • ChromePdfRendererをIronPDFライブラリから使用して、HTMLコンテンツをPDFドキュメントにレンダリングします。
  • GeneratePdfWithCancellationメソッドは非同期(async)であり、タスクを返します。 このメソッドは、CancellationToken(token)を受け取り、キャンセル要求を処理するためにタスクキャンセルを実行します。
  • CancellationTokenを使用することで、長時間実行される操作を安全にキャンセルできます。 ただし、キャンセルは協力的であり、タスク自体が定期的にトークンのステータスをチェックしなければなりません。
  • このコードでは、定期的なキャンセルチェックを伴う長期間のタスクをシミュレートしています。 重要な点は、PDF生成プロセス中にキャンセル(token.IsCancellationRequested)のチェックを手動で行い、トークンが渡されるとキャンセルメソッドを起動します。
  • ユーザーがプログラムのキャンセルを示すためにキーを押した場合、タスクは優雅に停止し、OperationCanceledExceptionをスローして、適切かつタイムリーにPDF生成の完了を防ぎます。
  • キャンセルが発生しない場合、結果のPDFは「output.pdf「として保存され、プログラムが完全なタスクプロセスを実行することを防ぎます。

IronPDFとCancellationTokenの実際の使用例

IronPDFと一つまたは複数のキャンセレーショントークンを使用することで、アプリケーションのパフォーマンスとユーザーエクスペリエンスを向上させるいくつかの実際的な状況があります。 以下にいくつかの例を示します:

1. Webアプリケーション

Webアプリケーションにおいて、ユーザーはPDFフォーマットでのレポート生成などのアクションをよく開始します。 しかし、ユーザーがページを離れたりブラウザを閉じた場合、システムはこれを検知し、キャンセレーショントークンを使用してPDF生成プロセスを停止できます。

HttpContext.Response.RegisterForDispose(CancellationTokenSource);
HttpContext.Response.RegisterForDispose(CancellationTokenSource);
HttpContext.Response.RegisterForDispose(CancellationTokenSource)
$vbLabelText   $csharpLabel

このシンプルな実装により、不要なタスクにリソースを捧げることを防ぎ、Webサーバーのスケーリング効率を向上させます。

2. 長時間ランニングのレポート

レポート用のアプリケーションでは、ユーザーが大量のデータセットをPDFとしてエクスポートすることを要求することがあります。 ユーザーが意見を変えたり、誤ったクエリを実行した場合、キャンセレーショントークンを使用することで、途中でタスクをキャンセルし、リソースの無駄を防ぐことができます。

3. バックグラウンドサービス

バックグラウンドサービスやマイクロサービスにおいては、大規模なバッチPDFを生成するなど、かなりの時間を要するタスクがキャンセレーショントークンを使用してより効率的に管理できます。 サービスがシャットダウンするまたはスケールダウンする前に、進行中のタスクをきれいにキャンセルし、データの損失や損傷を確実に回避します。

結論

今日のIronPDFでのキャンセレーショントークンの使用に関する議論を終えましたので、あなたはそれをプロのようにPDFプロジェクトに実装することができるでしょう! C#キャンセレーショントークンIronPDFを組み合わせて、高効率で応答性の高いアプリケーションを構築し、PDF生成タスクを優雅に処理します。 このアプローチは、タスクが実行中に中断されるのではなく、実行中の安全なポイントでキャンセル要求を確認できる協力キャンセルモデルを可能にします。

長時間実行されるレポートを管理したり、WebアプリケーションでのオンデマンドPDF生成やバックグラウンドサービスを管理したりする際に、単一または複数のCancellationTokenを組み込むことで、不要なタスクをキャンセルでき、リソースの無駄遣いを防ぎ、ユーザーエクスペリエンスを向上させます。

わずか数行のコードで、アプリのスケーラビリティと応答性を向上させ、ユーザーに自分のアクションに関するより多くのコントロールを提供できます。 IronPDFをまだ試していない方は、無料トライアルを試して、その強力なPDF生成能力がC#プロジェクトをどのように変革できるかを確認する絶好の機会です。

よくある質問

C#で長時間実行されるタスクを管理するためにCancellationTokenをどのように使用できますか?

CancellationTokenを長時間実行されるタスクに統合するには、それをタスクに渡し、キャンセルが要求されているかどうかを定期的に確認します。これにより、リソースを解放し、アプリケーションの応答性を維持しながら、タスクを円滑に終了できます。

PDF生成において、なぜCancellationTokenが重要ですか?

PDF生成では、CancellationTokenは、ユーザーがページから離れた場合などに不要になるタスクをキャンセルすることで、効率的にリソースを管理するのに役立ちます。これにより過剰なサーバーロードを防ぎ、ユーザーエクスペリエンスを向上させます。

C#のPDF生成タスクでCancellationTokenをどのように実装しますか?

C#のPDF生成タスクにおいて、CancellationTokenを実装するには、トークンをメソッドに渡し、実行中にキャンセル要求を定期的に確認します。キャンセルが検出された場合、タスクを円滑に終了できます。

PDF生成において、CancellationTokenと非同期メソッドを使用する目的は何ですか?

PDF生成でCancellationTokenと非同期メソッドを使用することで、タスクを非同期で実行し、アプリケーションの応答性を向上させ、不要になった場合にはタスクをキャンセルできるようにします。

CancellationTokenはWebアプリケーションでのユーザーエクスペリエンスをどのように改善しますか?

CancellationTokenを利用することで、ユーザーがページから離れる際にPDF生成などのタスクをキャンセルし、不要な処理を防ぎつつアプリケーションの応答性を維持することで、ユーザーエクスペリエンスを向上させます。

非同期のPDF作成におけるChromePdfRendererの役割は何ですか?

IronPDFのChromePdfRendererはHTMLコンテンツをPDFドキュメントに変換します。非同期操作をサポートしており、CancellationTokenを使用してタスクのライフサイクルと応答性を効果的に管理できます。

PDF生成中にキャンセル要求が行われた場合、何が起こりますか?

PDF生成中にキャンセル要求が行われた場合、タスクはCancellationTokenの状態を確認します。キャンセルが検出されると、OperationCanceledExceptionをスローし、プロセスを停止してリソースを節約します。

CancellationTokenはどのようにアプリケーションのスケーラビリティを向上させますか?

CancellationTokenは、例えばPDF生成時に不要なタスクをキャンセルできるため、リソース消費を削減し、アプリケーションの全体的なパフォーマンスを向上させることでスケーラビリティを向上させます。

バックグラウンドサービスでCancellationTokenを使用する利点は何ですか?

バックグラウンドサービスでは、サービスのシャットダウンやスケーリング操作時に、バッチPDF処理のような長時間実行されるタスクをクリーンにキャンセルできるように、CancellationTokenを使用して管理します。

CancellationTokenをIronPDFと統合することでアプリケーションの効率性はどのように向上しますか?

CancellationTokenをIronPDFと統合することで、不要なPDF生成タスクをキャンセルすることでリソース管理が改善され、アプリケーションの効率性と応答性が向上し、サーバーロードが軽減されます。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。