
C# ConfigureAwait(開発者向けの仕組み)
開発者として、非同期プログラミングは非常に有益です。アプリケーションのパフォーマンス、効率、および応答性を向上させることができます。特に、完了するのに予測不可能な時間がかかる操作を扱う場合に効果的です。 ConfigureAwait(false)を使用することで、特定のシナリオでデッドロックを回避できます。 デッドロックは、同期コンテキスト(デスクトップアプリケーションのUIスレッドなど)が操作の完了を待っているときに発生します。 それでも、待機しているタスクは同期コンテキストの開放を待っており、循環待ちが発生します。
本日は、ConfigureAwaitをIronPDFと組み合わせることで、非同期プログラミングを活用して効率的にPDF処理タスクを実行する方法を検討します。 IronPDFは、PDF関連のタスクを楽にする.NETのPDFライブラリです。 強力な機能セット、強力なクロスプラットフォーム互換性、そして豊富なドキュメントにより、あなたの開発者ツールキットに入れておくべき強力なPDFツールです。
Understanding Asynchronous Programming in C#
非同期プログラミングとは何でしょうか?
非同期プログラミングとは、メインアプリケーションのスレッドと独立して特定の操作を実行できるコードの記述方法を指します。 これは、I/O操作などの待機が必要な長時間実行されるタスクに役立ちます。 これらのタスクがメインスレッドをブロックせずに実行できるようにすることで、アプリケーションはこれらのタスクが完了するまで実行を続けることができ、最終的にはアプリケーションのパフォーマンスと応答性を向上させます。
非同期コードにおけるConfigureAwaitの役割
ConfigureAwaitは、非同期プログラミングで継続がどのように実行されるかを制御するために使用されるメソッドです。 継続はawait式の後に実行されるコードです。デフォルトではawaitが現在のコンテキストをキャプチャし、継続を元のコンテキストに戻そうとしますが、効果的でない場合があります。 ConfigureAwaitを使用すると、継続をキャプチャしたコンテキストで実行するかConfigureAwait(false)で示されます。
ConfigureAwait(false)を使用するとデッドロックを回避できます。なぜなら、これを使用することで、現在の同期コンテキストをキャプチャしないようにタスクに伝え、元のコンテキストで再開しようとしないからです。 これにより、継続が元のコンテキストではなくスレッドプールのスレッドで実行され、メインスレッドがブロックされるのを防ぎます。
ConfigureAwait(false)は、ライブラリコードや元のコンテキストへの再開が不要なケースで特に有用であり、コードを柔軟にし、デッドロックを避けることを保証します。
IronPDFでのConfigureAwaitの使用方法
.NETプロジェクトでのIronPDFの設定
.NETプロジェクトでIronPDFを使用開始するには、IronPDF NuGetパッケージをインストールして開始します。 これは、[ツール > NuGetパッケージマネージャ > ソリューションのNuGetパッケージマネージャ]に移動してIronPDFを検索することで行うことができます。

または、Package Manager Consoleで次のコマンドを実行することもできます。
IronPDFをコードで使用するには、コードファイルの一番上にusing IronPdf;ステートメントを配置してください。IronPDFの設定についてより詳しいガイドを知りたい場合は、そのスタートガイドページを確認してください。
IronPDFを使用した非同期PDFの生成
大容量のPDFファイルを生成する必要がある場合や複数の操作を同時に実行したい場合、PDFファイルを非同期で生成することは特に有益です。 IronPDFを使用することで、非同期でPDF関連のタスクを実行できます。これは次のような非同期コードになる場合があります:
using IronPdf;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
await GeneratePdfAsync();
}
static async Task GeneratePdfAsync()
{
// Create a new instance of ChromePdfRenderer.
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Example HTML content to be converted into a PDF.
string htmlContent = "<h1>Hello World!</h1>";
// Asynchronously render the HTML content as a PDF document.
PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);
// Asynchronously save the PDF document to a file.
await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));
Console.WriteLine("Working!");
}
}Imports IronPdf
Imports System.Threading.Tasks
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Await GeneratePdfAsync()
End Function
Private Shared Async Function GeneratePdfAsync() As Task
' Create a new instance of ChromePdfRenderer.
Dim renderer As New ChromePdfRenderer()
' Example HTML content to be converted into a PDF.
Dim htmlContent As String = "<h1>Hello World!</h1>"
' Asynchronously render the HTML content as a PDF document.
Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync(htmlContent)
' Asynchronously save the PDF document to a file.
Await Task.Run(Function() pdf.SaveAs("outputAsync.pdf"))
Console.WriteLine("Working!")
End Function
End Classこのコードでは、GeneratePdfAsync()メソッドで非同期にPDFドキュメントを作成しました。 ChromePdfRendererがHTMLコンテンツからPDFファイルを作成するためのレンダラーを作成するために使用されます。 PdfDocumentクラスは、提供されたHTMLストリングからPDFを作成するために使用されますが、HTMLファイル、URL、画像などからPDFを作成することもできます。 IronPDFでPDFを生成するさまざまな方法については、PDF生成のhow-toセクションを確認してください。
大容量PDFファイルを非同期で処理する
大きなPDFファイルを扱う際、ConfigureAwait(false)を使用した非同期メソッドは、長時間の操作中にメインスレッドを解放することで性能を大幅に向上させることができます。 この例では、大容量のPDFドキュメントを取り扱い、テキスト抽出タスクを実行して、非同期PDF処理の有益性を示します。
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class Program
{
static async Task Main(string[] args)
{
await LongPdfTask();
}
static async Task LongPdfTask()
{
try
{
// Initialize IronPDF's PdfDocument asynchronously.
PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);
// Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);
// Write the extracted text to a file asynchronously.
await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);
Console.WriteLine("Extraction complete!");
}
catch (Exception ex)
{
Console.WriteLine($"Error in LongPdfTask: {ex.Message}");
}
}
}Imports IronPdf
Imports System.Threading.Tasks
Imports System.IO
Imports System
Module Program
Async Function Main(args As String()) As Task
Await LongPdfTask()
End Function
Private Async Function LongPdfTask() As Task
Try
' Initialize IronPDF's PdfDocument asynchronously.
Dim pdf As PdfDocument = Await Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(False)
' Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
Dim text As String = Await Task.Run(Function() pdf.ExtractAllText()).ConfigureAwait(False)
' Write the extracted text to a file asynchronously.
Await Task.Run(Sub() File.WriteAllText("extractedText.txt", text)).ConfigureAwait(False)
Console.WriteLine("Extraction complete!")
Catch ex As Exception
Console.WriteLine($"Error in LongPdfTask: {ex.Message}")
End Try
End Function
End Module上記のコードでは、ConfigureAwait(false)を使用して、200ページ以上の大きなPDFファイルからすべてのテキストを抽出するという大きく時間のかかるタスクを実行しました。
-
インポートとセットアップ: コードの先頭セクションは、必要なライブラリと名前空間のインポートに専念しています。 IronPDFライブラリを使用するために
using IronPdf;を確認する必要があります。 -
クラスとメインメソッド:
class Programは、このプロジェクトのメインアプリケーションコードを含むクラスを定義します。 アプリケーションのエントリポイントはstatic async Task Main(string[] args)です。 ここでは、非同期操作がその中から実行できるようにasyncとしてマークしました。 その後、**await LongPdfTask()**を使用して、LongPdfTaskメソッドを非同期に呼び出します。 -
Tryブロック: Unexpectedな例外を上手に処理するために、LongPdfTaskメソッド内のコードをtry-catchブロックでラップしました。
-
PdfDocument PDF = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false) : この行は次の3つのセグメントに分けられます:
-
PdfDocument.FromFile("Sample.pdf"): ここでは、指定されたPDFファイルをIronPdf.PdfDocumentオブジェクトに同期的にロードします。- await Task.Run(() => ...): PDFの読み込み操作を別のスレッドで実行し、メインスレッドをブロックしないようにします。 これを非同期操作とします。
- .ConfigureAwait(false): 現在のコンテキストのキャプチャを避け、パフォーマンスを向上させ、デッドロックを減少させます。
-
string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false): これはIronPDFテキスト抽出メソッド、
ExtractAllText()を実行します。 再び、**await Task.Run(() => ...)**を使用して、この操作を別のスレッドで非同期に実行します。 -
await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false): これにより、再びawait Taskメソッドを使用して、抽出されたテキストを.txtファイルに非同期で書き込みます。
前

出力

.NETアプリケーションでのConfigureAwaitの使用のベストプラクティス
ConfigureAwait(true)対 ConfigureAwait(false)を使用するタイミング
**ConfigureAwait(false)**は、ライブラリコードやバックグラウンド処理をしているときに、同期コンテキストを維持する必要がない場合に最適です。 通常、これはサーバーサイドコードでパフォーマンスが重要な場合に使用します。 **ConfigureAwait(false)**を使用すると、await操作が終了したときに、継続が必ずしも非同期操作を開始したスレッドで実行されません。
PDF処理に関しては、**ConfigureAwait(false)**を実装することで、コンテキストの切り替えによるボトルネックを回避し、複数のPDF処理タスクを実行する際のパフォーマンスを最大化するのに役立ちます。 また、コンソールアプリケーションやバックグラウンドサービスで作業をしている場合に、コンテキストの切り替えが不要になる状況でも、アプリケーションの効率を維持するのに役立ちます。
**ConfigureAwait(true)**はUI環境や単体テスト時に最適ですが、不適切だとデッドロックを招く可能性があります。 たとえば、UIの更新やhttpcontextへのアクセスを行う場合などで使用されます。 ConfigureAwait(true)はデフォルトの動作で、そのままConfigureAwaitと書くこともできます。
PDF処理タスクで使用する場合、UIとしっかり統合されたケース(WPF, WinFormsなどのUIアプリケーションを使用する際)で、同期コンテキストをキャプチャしてこれらの更新がUIスレッドで起こることを確認する必要がある時に特に有益です。 特定のスレッドで実行されなければならないスレッド関連の操作においても有益です。
非同期IronPDF操作における例外処理
非同期プログラミングでの例外処理は重要な点であり、慎重な考慮が必要です。未捕捉の例外はアプリケーションを停止させる可能性があります。 非同期コードの周りにtry-catchブロックを配置することは、予期しない例外をうまく処理するための良い方法です。
例えば:
public async Task SafeGeneratePdfAsync()
{
try
{
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Asynchronously render HTML as PDF and do not capture the context
PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);
// Asynchronously save PDF to file
await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}Public Async Function SafeGeneratePdfAsync() As Task
Try
Dim renderer As New ChromePdfRenderer()
' Asynchronously render HTML as PDF and do not capture the context
Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(False)
' Asynchronously save PDF to file
Await Task.Run(Sub() pdf.SaveAs("output.pdf")).ConfigureAwait(False)
Catch ex As Exception
Console.WriteLine($"An error occurred: {ex.Message}")
End Try
End FunctionConfigureAwait(false)を使った継続タスクを使用する際、例外は継続内でtry-catchを使って処理するか、Task.ContinueWithを使用した場合はTask.Exceptionプロパティで処理できます。
このようなコードを記述する例としては次のようになります:
class Program
{
public static async Task Main(string[] args)
{
await ProcessPdfWithContinuationAsync();
}
static Task ProcessPdfWithContinuationAsync()
{
return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
.ContinueWith(pdfTask =>
{
if (pdfTask.IsFaulted)
{
// Handle exceptions from loading the PDF
Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
return;
}
var pdf = pdfTask.Result;
// Extract text asynchronously with exception handling
Task.Run(() => pdf.ExtractAllText())
.ContinueWith(extractTask =>
{
if (extractTask.IsFaulted)
{
// Handle exceptions from extracting text
Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
return;
}
// Proceed if text extraction is successful
Console.WriteLine("Extracted text:");
Console.WriteLine(extractTask.Result);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}
}Friend Class Program
Public Shared Async Function Main(ByVal args() As String) As Task
Await ProcessPdfWithContinuationAsync()
End Function
Private Shared Function ProcessPdfWithContinuationAsync() As Task
Return Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ContinueWith(Sub(pdfTask)
If pdfTask.IsFaulted Then
' Handle exceptions from loading the PDF
Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}")
Return
End If
Dim pdf = pdfTask.Result
' Extract text asynchronously with exception handling
Task.Run(Function() pdf.ExtractAllText()).ContinueWith(Sub(extractTask)
If extractTask.IsFaulted Then
' Handle exceptions from extracting text
Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}")
Return
End If
' Proceed if text extraction is successful
Console.WriteLine("Extracted text:")
Console.WriteLine(extractTask.Result)
End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
End Function
End ClassIronPDFをPDF処理ニーズに選ぶ理由
IronPDFの重要機能と利点

IronPDFは、すべてのPDF関連タスクに対して豊富な機能セットを提供する強力なC# PDFライブラリです。 .NET 8, 7, 6, .NET Core, Standard, Frameworkをフルサポートし、Windows, Linux, Mac, Docker, Azure, AWSなど、さまざまなアプリ環境で実行できますので、IronPDFを希望する環境で最大限に利用することができます。
IronPDFを使用すると、さまざまなファイルおよびデータタイプからPDFを生成できます。HTMLファイル、HTML文字列、URL、画像、DOCX、RTFなど、わずか数行のコードで! PDFドキュメントのフォーマットを処理し、カスタム透かしを適用し、PDFの結合や分割を行い、PDFの暗号化やセキュリティを処理できます。
非同期プログラミングに対するIronPDFのサポート
IronPDFは多くの操作に対して非同期メソッドを提供し、開発者がシームレスにasync/awaitパターンを活用できるようにしています。 このサポートにより、パフォーマンスが重要なアプリケーションにIronPDFを組み込んで応答性を損なうことなく統合でき、非同期の環境でPDF関連のタスクを実行する開発者にとって非常に価値のあるPDFツールになります。
ライセンス
IronPDF の機能を自分で試して、その幅広い機能を探求したい場合は、無料トライアル期間のおかげで簡単に実行できます。 インストールが簡単で迅速なので、PDFプロジェクトでIronPDFをすぐに使い始めることができます。さらにその強力な機能を活用してPDFを向上させたい方は? ライセンスは$999から始まり、30日間の返金保証、1年間の製品サポートと更新が付帯し、永続ライセンスとして提供されます(煩わしい定期料金はありません!)
例: PDF生成用のConfigureAwaitとIronPDFの使用
PDFを非同期で生成するには、IronPDFを使用してHTMLファイルをレンダリングするコードを実行し、結果を保存します。この際、**ConfigureAwait(false)**を使用して継続が不要に元の同期コンテキストに切り替わらないようにします。
using IronPdf;
using System.Threading.Tasks;
using System;
class Program
{
public static async Task Main(string[] args)
{
await CreateInvoicePdfAsync();
}
static async Task<string> CreateInvoicePdfAsync()
{
// Instance of ChromePdfRenderer to convert HTML to PDF
ChromePdfRenderer renderer = new ChromePdfRenderer();
try
{
// Render HTML file as a PDF asynchronously without capturing the context.
var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);
// Save the generated PDF asynchronously.
await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);
return "invoice.pdf";
}
catch (Exception ex)
{
Console.WriteLine($"Error generating PDF: {ex.Message}");
return null;
}
}
}Imports IronPdf
Imports System.Threading.Tasks
Imports System
Module Program
Public Async Function Main(args As String()) As Task
Await CreateInvoicePdfAsync()
End Function
Private Async Function CreateInvoicePdfAsync() As Task(Of String)
' Instance of ChromePdfRenderer to convert HTML to PDF
Dim renderer As New ChromePdfRenderer()
Try
' Render HTML file as a PDF asynchronously without capturing the context.
Dim pdf = Await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(False)
' Save the generated PDF asynchronously.
Await Task.Run(Sub() pdf.SaveAs("invoice.pdf")).ConfigureAwait(False)
Return "invoice.pdf"
Catch ex As Exception
Console.WriteLine($"Error generating PDF: {ex.Message}")
Return Nothing
End Try
End Function
End Moduleこの例では、作成した非同期メソッド、**static async Task<string> CreateInvoicePdfAsync()を使用して、RenderHtmlFileAsPdfAsyncメソッドで提供されたHTMLファイルからPDF請求書を生成します。 タスクの継続が不必要に元の同期コンテキストに戻るのを防ぐためにConfigureAwait(false)**を使用し、非UIアプリケーションのパフォーマンスを改善しています。
また、await Task.Run()) => ...)メソッドを再び使用して、操作を非同期で実行しています。 最後に、新たに生成されたPDFファイルをpdf.SaveAsメソッドを使用して"invoice.pdf"として保存しました。 **CreateInvoicePdfAsync()**メソッド内のすべてのコードは、予期しない例外を処理するためにtry-catchブロックにラップされています。
HTMLファイル

出力

ご覧の通り、HTMLファイルを非同期でPDFに無事変換し、きれいで高品質なPDFファイルが生成されました。
結論
非同期プログラミングは、応答性が高く効率的な.NETアプリケーションの構築に不可欠であり、ConfigureAwaitを正しく使用することでアプリケーションレベルのコードのパフォーマンスを最適化できます。 IronPDFを使用する際には、非同期のメソッドと**ConfigureAwait(false)**を組み合わせて使用することで、PDF処理タスクがメインスレッドをブロックせずに応答性を向上させることができます。 ConfigureAwaitの使用時期と使用方法を理解することで、IronPDFのPDF処理タスクをより堅牢でパフォーマンスに優れたものにできます。
これで、非同期プログラミングにおいて、ConfigureAwaitをIronPDFと共に活用するプロとしての技術を身に付けたわけですが、何を待っていますか? IronPDFを試して、PDF関連のプロジェクトをどのように向上させることができるか確認してください! IronPDFの多機能性を持つ一般的なライブラリコードとしての詳細な情報を知りたい場合は、便利なhow-toガイドをチェックしてください。 また、非同期プログラミング手法と共にIronPDFを使用する方法やIronPDF一般に関する詳細な情報を知りたい場合は、私たちのブログ記事をチェックしてください。 もしより多くの非同期PDF生成の例を探しているなら、C# Wait For Seconds投稿や、他のC# Task.Run投稿を見てください。

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。
関連する記事


