.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でキャンセレーショントークンを使用する理由は?

PDFを生成する際、特にWebアプリケーションや複雑なレポートシステムにおいて、ユーザーが大きなPDFファイルの作成などのタスクを開始したが、その後他のページへ移動したり、結果をもう必要としなくなったりする状況に遭遇することがあります。 このような場合、サーバーやUIに不必要な負荷がかからないよう、PDF生成プロセスをキャンセルするオプションが必要です。

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

不要な負荷を防ぐ

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

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

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

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

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

IronPDFでCancellationTokenを実装する方法

CancellationTokenがなぜ有用であるか理解したところで、IronPDFと共にそれを実装する方法を見ていきましょう。

ステップ1:プロジェクトでIronPDFをセットアップする

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

NuGet パッケージ マネージャー コンソールを使用して

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

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
$vbLabelText   $csharpLabel

ソリューションのためのNuGetパッケージマネージャーを通じて

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

-->

IronPDFをインストールしたら、IronPDFを使用するために必要なのはコードの先頭に正しいusingステートメントを追加することだけです。

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();
        // Creating our one 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();
        // Creating our one 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()
		' Creating our one 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# Cancellationtoken (開発者にはどのように機能するのか): 図2 - コンソール出力

PDF出力

C# Cancellationtoken(開発者向けの仕組み):図3 - PDF出力

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

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

CancellationTokenを使用したIronPDFの実際のユースケース

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

ウェブアプリケーション

ウェブアプリケーションでは、ユーザーはしばしばPDF形式でのレポート作成などのアクションを開始します。 しかし、ユーザーがページから離れたりブラウザを閉じたりすると、システムはこれを検出し、CancellationToken を使用してPDF生成プロセスを停止することができます。

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

このシンプルな実装により、不要になったタスクにリソースを割り当てることなく、Webサーバーがより効果的にスケールできるようになります。

長時間実行のレポート

レポートアプリケーションでは、ユーザーが大規模なデータセットをPDFとしてエクスポートするよう要求することがあります。 ユーザーが気が変わったり、誤ったクエリを行った場合、CancellationTokenを使用すると、タスクを途中でキャンセルすることができ、リソースの浪費を防ぐことができます。

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

バックグラウンドサービスやマイクロサービスにおいて、CancellationTokenを使用することで、大量のPDFバッチを生成するなどの多くの時間を要するタスクをより効率的に管理できます。 サービスがシャットダウンまたは縮小される際、進行中のタスクはクリーンにキャンセルされ、データが失われたり破損したりすることがないように保証されます。

結論

これで、IronPDFでcancellationtokensを使用することについての今日のディスカッションの終わりに来ました。プロのようにPDFプロジェクトにそれらを実装できるようになります! C# CancellationTokenIronPDFと共に使用することで、PDF生成タスクを優雅に処理する、より効率的で応答性の高いアプリケーションを構築することができます。 このアプローチは協調キャンセルモデルを可能にし、タスクが実行中のセーフポイントでキャンセル要求を確認することができるようにします。これにより、突然終了されることなく、適切なタイミングでキャンセルを行うことができます。

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

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

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# Select Case(開発者向けの仕組み)
次へ >
math.max C#(開発者向けの仕組み)