.NET ヘルプ

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

公開済み 2024年12月15日
共有:

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

そこでキャンセルトークンC#で役立ちます。 と統合することによってIronPDF、PDF生成タスクが応答性と効率性を兼ね備えていることを確実にできます。 この記事では、CancellationToken の重要性、IronPDF と相性が良い理由、タスクを優雅にキャンセルするためにどのように実装できるかについて探ります。

C#のCancellationTokenとは何ですか?

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

それはどのように動作しますか?

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

CancellationTokensを使用することで、システムリソースの浪費や悪いユーザーエクスペリエンスなど、不必要に長時間実行されるタスクの潜在的な欠点を回避できます。

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

C#では、内部キャンセレーショントークンは、外部ソースから渡されるのではなく、特定のクラスまたはメソッド内で作成および管理されるキャンセレーショントークンを指します。 これは、単一コンポーネントの範囲内でタスクのキャンセルをより細かく制御できるようにし、内部から発生するキャンセル要求を監視し、応答することを可能にします。

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

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

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

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

1. 不必要な負荷を防ぐ

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

2. ユーザーエクスペリエンスを向上させる

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

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

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

IronPDFでCancellationTokenを実装する方法

CancellationToken がなぜ便利であるかを理解したところで、それを IronPDF でどのように実装するかを説明しましょう。

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

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

NuGet パッケージ マネージャー コンソール経由

以下の内容を日本語に翻訳してください:

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

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
VB   C#

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

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

壊れた画像 Pixabayから追加、ファイルから選択、またはここに画像をドラッグアンドドロップしてください。

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

using IronPdf;
using IronPdf;
Imports IronPdf
VB   C#

ステップ 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
VB   C#

コンソール出力

C# CancellationToken(開発者向けの動作方法): 図2 - コンソール出力

PDF出力

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

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

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

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

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

1. Webアプリケーション

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

HttpContext.Response.RegisterForDispose(CancellationTokenSource);
HttpContext.Response.RegisterForDispose(CancellationTokenSource);
HttpContext.Response.RegisterForDispose(CancellationTokenSource)
VB   C#

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

2. 長時間実行されるレポート

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

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

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

結論

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

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

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

< 以前
C# Select Case(開発者向けの仕組み)
次へ >
math.max C#(開発者向けの仕組み)