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に不要な負荷をかけないようにしたいものです。
以下がIronPDFとCancellationTokenを使用することが重要な理由です:
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を開いてパッケージマネージャーコンソールに移動します。 その後、以下のコマンドを実行します。
ソリューションのNuGetパッケージマネージャー経由で
Visual Studioを開いたら、"ツール -> NuGetパッケージマネージャー -> ソリューションのNuGetパッケージを管理"に移動してIronPDFを検索します。 ここから、プロジェクトを選択して"インストール"をクリックするだけで、IronPDFがプロジェクトに追加されます。
IronPDFをインストールしたら、IronPDFを使い始めるためには、コードの先頭に正しいusing文を追加するだけです。
using IronPdf;Imports IronPdfImports IronPdfステップ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(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
' 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 ex 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(args As String()) As Task
' Create a CancellationTokenSource
Dim cancellationTokenSource = New CancellationTokenSource()
' Create our cancellation token
Dim token = cancellationTokenSource.Token
' Start the PDF generation task
Dim pdfGenerator = 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 ex As OperationCanceledException
' Confirm the cancellation
Console.WriteLine("The PDF generation was canceled.")
Finally
cancellationTokenSource.Dispose()
End Try
Console.WriteLine("Program finished.")
End Function
End ClassImports IronPdf
Imports System
Imports System.Threading
Imports System.Threading.Tasks
Public Class PdfGenerator
Public Async Function GeneratePdfWithCancellation(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
' 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 ex 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(args As String()) As Task
' Create a CancellationTokenSource
Dim cancellationTokenSource = New CancellationTokenSource()
' Create our cancellation token
Dim token = cancellationTokenSource.Token
' Start the PDF generation task
Dim pdfGenerator = 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 ex 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コンソール出力

PDF 出力

この例では、CancellationTokenをC#プログラムで使用して、IronPDFを使用した長時間実行されるPDF生成タスクをキャンセルする方法を示します。 コードは2つの部分に分かれています: PDF生成プロセス(PdfGenerator クラス)とメインプログラムロジック(Program クラス)。
- クラスPdfGenerator:このクラスには、CancellationTokenを通じてキャンセルをサポートしつつ、PDFファイル生成をシミュレートするメソッドが含まれています。
- mainメソッド内で
CancellationTokenSource()を使用してキャンセルトークンソースを作成し、次にCancellationTokenSourceのTokenプロパティを渡してトークンオブジェクトを作成します。 - ChromePdfRendererをIronPDFライブラリから使用して、HTMLコンテンツをPDFドキュメントにレンダリングします。
- GeneratePdfWithCancellation メソッドは非同期です(
async)であり、タスクを返します。 このメソッドはキャンセル要求を通じてタスクのキャンセルを扱うためにCancellationToken(token)を受け入れます。 - CancellationTokenを使用することで、長時間実行される操作を安全にキャンセルできます。 ただし、キャンセルは協力的であり、タスク自体が定期的にトークンのステータスをチェックしなければなりません。
- このコードでは、定期的なキャンセルチェックを伴う長期間のタスクをシミュレートしています。 重要な点は、PDF生成プロセス中に手動でキャンセル(
token.IsCancellationRequested)をチェックし、トークンが渡された場合にキャンセルメソッドを実行する準備をすることです。 - ユーザーがプログラムのキャンセルを示すためにキーを押した場合、タスクは優雅に停止し、OperationCanceledExceptionをスローして、適切かつタイムリーにPDF生成の完了を防ぎます。
- キャンセルが発生しない場合、結果のPDFは"output.pdf"として保存され、プログラムが完全なタスクプロセスを実行することを防ぎます。
IronPDFとCancellationTokenの実際の使用例
複数のキャンセルトークンを使用することで、IronPDFを使用した場合、アプリケーションの性能とユーザーエクスペリエンスを向上させることができる実用的な状況がいくつかあります。 以下はその例のいくつかです:
1. Webアプリケーション
Webアプリケーションにおいて、ユーザーはPDFフォーマットでのレポート生成などのアクションをよく開始します。 ただし、ユーザーがページから離れたりブラウザを閉じたりすると、システムはこれを検出し、CancellationTokenを使用してPDF生成プロセスを停止できます。
HttpContext.Response.RegisterForDispose(CancellationTokenSource);HttpContext.Response.RegisterForDispose(CancellationTokenSource);HttpContext.Response.RegisterForDispose(CancellationTokenSource)HttpContext.Response.RegisterForDispose(CancellationTokenSource)このシンプルな実装により、不要なタスクにリソースを捧げることを防ぎ、Webサーバーのスケーリング効率を向上させます。
2. 長時間ランニングのレポート
レポート用のアプリケーションでは、ユーザーが大量のデータセットをPDFとしてエクスポートすることを要求することがあります。 ユーザーが考えを変えたり、不正確なクエリを実行したりした場合、CancellationTokenを使用して途中でタスクをキャンセルし、リソースの無駄を防ぐことができます。
3. バックグラウンドサービス
バックグラウンドサービスやマイクロサービスでは、大きなPDFバッチの生成のように多くの時間を要するタスクを管理する際にCancellationTokenを使用してより効率的に管理できます。 サービスがシャットダウンまたはスケールダウンする直前に、進行中のタスクをクリーンにキャンセルでき、データが失われたり破損したりすることがないようにします。
結論
今日のIronPDFでのキャンセレーショントークンの使用に関する議論を終えましたので、あなたはそれをプロのようにPDFプロジェクトに実装することができるでしょう! C#キャンセレーショントークンとIronPDFを組み合わせて、高効率で応答性の高いアプリケーションを構築し、PDF生成タスクを優雅に処理します。 このアプローチは、タスクが実行中に中断されるのではなく、実行中の安全なポイントでキャンセル要求を確認できる協力キャンセルモデルを可能にします。
長時間実行されるレポートを管理したり、WebアプリケーションでのオンデマンドPDF生成やバックグラウンドサービスを管理したりする際に、単一または複数のCancellationTokenを組み込むことで、不要なタスクをキャンセルでき、リソースの無駄遣いを防ぎ、ユーザーエクスペリエンスを向上させます。
わずか数行のコードで、アプリのスケーラビリティと応答性を向上させ、ユーザーに自分のアクションに関するより多くのコントロールを提供できます。 IronPDFをまだ試していない方は、無料トライアルを試して、その強力なPDF生成能力がC#プロジェクトをどのように変革できるかを確認する絶好の機会です。
ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。