C#で非同期およびマルチスレッドでPDFファイルを生成する方法

C#で非同期とマルチスレッドを使ってPDFを生成する方法</#35;

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDFはC#で非同期処理とマルチスレッドによるハイパフォーマンスなPDF生成を可能にし、複雑なHTMLレンダリングシナリオのバッチ処理時間を同期処理と比較して最大65%短縮します。

クイックスタート: IronPDFを使用して HTML を非同期的に PDF に変換する

IronPDFを使用してわずか数行のコードで非同期PDF生成を開始できます。

RenderHtmlAsPdfAsync メソッドを使用すると、HTML コンテンツを効率的に PDF に変換し、アプリケーションのパフォーマンスを最適化できます。 このガイドでは、バッチ処理やマルチスレッド環境に最適な、高性能PDF生成のための非同期操作の活用方法を紹介します。

  1. IronPDF をNuGetパッケージマネージャでインストール

    PM > Install-Package IronPdf
  2. このコード スニペットをコピーして実行します。

    var pdf = await IronPdf.ChromePdfRenderer.RenderHtmlAsPdfAsync("<h1>Hello World!</h1>");
  3. 実際の環境でテストするためにデプロイする

    今日プロジェクトで IronPDF を使い始めましょう無料トライアル

    arrow pointer


C#で非同期PDF生成を実装するには?

IronPDF は、RenderHtmlAsPdfAsync などのレンダリング メソッドを使用した非同期操作を完全にサポートします。 IronPDFのasync実装はタスクベースの非同期パターン(TAP)を活用し、ノンブロッキングのPDF生成操作を可能にします。 このアプローチは、複雑なHTMLコンテンツのレンダリングやPDFリクエストの同時処理に役立ちます。

非同期PDF生成は、デスクトップアプリケーションのUIフリーズを防ぎ、Webアプリケーションのリクエストスループットを向上させます。 await パターンを使用すると、アプリケーションは PDF レンダリングが完了するまで他の操作を処理できるため、応答性とユーザー エクスペリエンスが大幅に向上します。

なぜPDF生成に非同期メソッドを使用する必要があるのですか

非同期メソッドは、PDF生成ワークフローに重要な利点を提供します。 これらの開発ツールは、リソースを大量に消費する操作中にアプリケーションの応答性を維持し、マルチコアプロセッサでのリソース利用を改善し、サーバー環境でのスケーラビリティを向上させます。 複雑なHTMLからPDFへの変換を扱うとき、非同期操作はタイムアウトの問題を防ぎ、ユーザーエクスペリエンスを向上させます。

:path=/static-assets/pdf/content-code-examples/how-to/async-async.cs
using IronPdf;
using System.Threading.Tasks;

// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();

string[] htmlStrings = {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"};

// Create an array to store the tasks for rendering
var renderingTasks = new Task<PdfDocument>[htmlStrings.Length];

for (int i = 0; i < htmlStrings.Length; i++)
{
    int index = i; // Capturing the loop variable
    renderingTasks[i] = Task.Run(async () =>
    {
        // Render HTML to PDF
        return await renderer.RenderHtmlAsPdfAsync(htmlStrings[index]);
    });
}

// Wait for all rendering tasks to complete
// await Task.WhenAll(renderingTasks);
$vbLabelText   $csharpLabel

バッチ処理の一般的なパターンは何ですか?

PDFのバッチ処理には、メモリ使用量とパフォーマンスを慎重に考慮する必要があります。 効果的なパターンとしては、複数の PDF 生成を並列実行するために Task.WhenAll を使用すること、大規模なバッチ用のチャネルを使用してプロデューサー/コンシューマー パターンを実装すること、 IronPDFドキュメントの並列処理の例を利用することなどがあります。

// Batch processing with progress tracking
public async Task<List<PdfDocument>> ProcessBatchAsync(List<string> htmlContents, IProgress<int> progress)
{
    var renderer = new ChromePdfRenderer();
    var results = new List<PdfDocument>();
    var completed = 0;

    var tasks = htmlContents.Select(async html => {
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        Interlocked.Increment(ref completed);
        progress?.Report(completed);
        return pdf;
    });

    results.AddRange(await Task.WhenAll(tasks));
    return results;
}
// Batch processing with progress tracking
public async Task<List<PdfDocument>> ProcessBatchAsync(List<string> htmlContents, IProgress<int> progress)
{
    var renderer = new ChromePdfRenderer();
    var results = new List<PdfDocument>();
    var completed = 0;

    var tasks = htmlContents.Select(async html => {
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        Interlocked.Increment(ref completed);
        progress?.Report(completed);
        return pdf;
    });

    results.AddRange(await Task.WhenAll(tasks));
    return results;
}
$vbLabelText   $csharpLabel

非同期PDF操作でエラーを処理するには?

非同期PDF操作におけるエラー処理には、包括的な例外管理戦略が必要です。 非同期メソッド内でtry-catchブロックを使用し、一時的な失敗のために再試行ロジックを実装し、高度な再試行ポリシーのためにPollyの使用を検討してください。 詳細なパフォーマンスのトラブルシューティングのために、IronPdfは広範なログ機能を提供します。

public async Task<PdfDocument> RenderWithRetryAsync(string html, int maxRetries = 3)
{
    var renderer = new ChromePdfRenderer();

    for (int i = 0; i < maxRetries; i++)
    {
        try
        {
            return await renderer.RenderHtmlAsPdfAsync(html);
        }
        catch (Exception ex) when (i < maxRetries - 1)
        {
            // Log the exception
            await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, i))); // Exponential backoff
        }
    }

    throw new InvalidOperationException("Failed to render PDF after maximum retries");
}
public async Task<PdfDocument> RenderWithRetryAsync(string html, int maxRetries = 3)
{
    var renderer = new ChromePdfRenderer();

    for (int i = 0; i < maxRetries; i++)
    {
        try
        {
            return await renderer.RenderHtmlAsPdfAsync(html);
        }
        catch (Exception ex) when (i < maxRetries - 1)
        {
            // Log the exception
            await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, i))); // Exponential backoff
        }
    }

    throw new InvalidOperationException("Failed to render PDF after maximum retries");
}
$vbLabelText   $csharpLabel

PDF生成にマルチスレッドを使用するにはどうすればよいですか?

IronPDFはスレッドセーフであり、ChromePdfRendererレンダリングエンジンを使用する場合、マルチスレッドをサポートします。ただし、macOSマシンではマルチスレッドが制限されることに注意してください。 Chromeレンダリングエンジンは、並行処理のための優れたスレッド安全性とパフォーマンス特性を提供します。

The Parallel.ForEach pattern works well for batch processing PDFs, allowing you to leverage all available CPU cores effectively. 包括的なマルチスレッド生成の例については、IronPDFのドキュメントを参照してください。

いつ非同期よりもマルチスレッドを選択すべきですか?

マルチスレッディングは、十分なシステムリソースで複数のPDFを同時に処理する必要があるCPUバウンド操作に最適です。 マルチスレッドは、マルチコアシステム上で大量のPDFを処理するとき、各PDF生成が独立しているとき、メモリ使用量を制御できるときに選択します。 非同期は、I/Oバウンド操作とアプリケーションの応答性の維持に適しています。

スレッド安全性の考慮事項とは

IronPDF の ChromePdfRenderer はスレッドセーフになるように設計されていますが、特定の考慮事項が適用されます。 カスタム設定を使用する場合はスレッドごとに個別のレンダラー インスタンスを作成し、同期せずにスレッド間でインスタンスを共有することを避け、大きなドキュメントを同時に処理する場合はメモリ消費を監視します。 インストールの概要では、スレッドセーフを最適化するためのIronPDFの設定についての詳細を説明しています。

// Thread-safe PDF generation with custom settings per thread
public void ProcessPdfsInParallel(List<string> htmlContents)
{
    Parallel.ForEach(htmlContents, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, 
        html =>
        {
            // Create a new renderer instance for each thread
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    PaperSize = IronPdf.Rendering.PdfPaperSize.A4
                }
            };

            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs($"output_{Thread.CurrentThread.ManagedThreadId}_{DateTime.Now.Ticks}.pdf");
        });
}
// Thread-safe PDF generation with custom settings per thread
public void ProcessPdfsInParallel(List<string> htmlContents)
{
    Parallel.ForEach(htmlContents, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, 
        html =>
        {
            // Create a new renderer instance for each thread
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    PaperSize = IronPdf.Rendering.PdfPaperSize.A4
                }
            };

            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs($"output_{Thread.CurrentThread.ManagedThreadId}_{DateTime.Now.Ticks}.pdf");
        });
}
$vbLabelText   $csharpLabel

いくつの同時スレッドを使用する必要がありますか?

最適な同時スレッド数は、CPUコア、利用可能なメモリ、PDFの複雑さによって異なります。 一般的なガイドラインとしては、CPU 依存の操作に Environment.ProcessorCount を使用すること、メモリを大量に消費する PDF の場合は 2 ~ 4 スレッドに制限すること、最適な構成を見つけるためにシステム リソースを監視することなどがあります。 async の例は、さまざまなスレッド戦略を示しています。

どのようなパフォーマンスの向上が期待できますか?

比較の結果、レンダリング・アプローチによってパフォーマンスに大きな違いがあることがわかりました。 複雑なHTMLレンダリングをシミュレートするためのWaitForクラスで、レンダリングに5秒の遅延が追加されます。 以下に、上記のさまざまなテクニックを使用した場合のパフォーマンスの比較表を示します。

なぜ非同期は同期よりもパフォーマンスが良いのですか

通常レンダリング 非同期レンダー マルチスレッドレンダー
15.75秒 05.59秒 05.68秒

非同期処理は、効率的なスレッドプールリソース管理を可能にし、メインスレッドのブロッキングを防ぎ、I/O処理中のCPU利用率を向上させるので優れています。 パフォーマンスの向上は、複数のレンダリング操作を同時に開始することによってもたらされます。

アプリケーションのパフォーマンスはどのように測定できますか?

PDF生成のパフォーマンスを測定するには、適切なベンチマークとモニタリングが必要です。 正確なタイミング測定には System.Diagnostics.Stopwatch を使用し、運用監視用のカスタム パフォーマンス カウンターを実装し、アプリケーション インサイトや同様の APM ツールを活用します。 クイックスタートガイドの例をパフォーマンステストのベースラインとして使用することを検討してください。

public async Task<PerformanceMetrics> MeasurePerformanceAsync(string html, int iterations)
{
    var metrics = new PerformanceMetrics();
    var renderer = new ChromePdfRenderer();
    var stopwatch = new Stopwatch();

    // Warm-up run
    await renderer.RenderHtmlAsPdfAsync(html);

    for (int i = 0; i < iterations; i++)
    {
        stopwatch.Restart();
        await renderer.RenderHtmlAsPdfAsync(html);
        stopwatch.Stop();

        metrics.AddMeasurement(stopwatch.ElapsedMilliseconds);
    }

    return metrics;
}
public async Task<PerformanceMetrics> MeasurePerformanceAsync(string html, int iterations)
{
    var metrics = new PerformanceMetrics();
    var renderer = new ChromePdfRenderer();
    var stopwatch = new Stopwatch();

    // Warm-up run
    await renderer.RenderHtmlAsPdfAsync(html);

    for (int i = 0; i < iterations; i++)
    {
        stopwatch.Restart();
        await renderer.RenderHtmlAsPdfAsync(html);
        stopwatch.Stop();

        metrics.AddMeasurement(stopwatch.ElapsedMilliseconds);
    }

    return metrics;
}
$vbLabelText   $csharpLabel

PDF生成速度に影響する要因は何ですか

PDF生成のパフォーマンスにはいくつかの要因が影響します。 JavaScriptの実行やCSSのレンダリングなど、HTMLの複雑さは処理時間に直接影響します。画像やフォントなどの外部リソースの読み込みは、遅延を引き起こす可能性があります。 CPU、メモリ、ディスクI/Oなどのシステムリソースが重要な役割を果たします。 レンダリングオプションやエンジン設定を含むIronPDFの設定もスピードに影響します。 これらの要素を理解することで、PDF生成のワークフローを最適化し、効率を最大限に高めることができます。

重いJavaScriptや遅延レンダリングを含む複雑なシナリオでは、PDF生成前に完全なページレンダリングを保証するためにWaitForメカニズムの使用を検討してください。 このアプローチは、予測可能なパフォーマンス特性を維持しながら、正確な出力を保証します。

よくある質問

非同期PDF生成でどの程度のパフォーマンス向上が期待できますか?

IronPDFの非同期処理とマルチスレッドにより、特に複雑なHTMLコンテンツをレンダリングする場合、バッチ処理時間を同期処理に比べて最大65%短縮することができます。実際の性能向上はHTMLの複雑さ、システムリソース、同時処理数などの要因に依存します。

HTMLを非同期でPDFに変換する最も簡単な方法は何ですか?

最もシンプルな方法はIronPDFのRenderHtmlAsPdfAsyncメソッドを使うことです。たった1行のコードでvar pdf = await IronPDF.ChromePdfRenderer.RenderHtmlAsPdfAsync("Hello World!");`, アプリケーションの応答性を維持しながら効率的にHTMLコンテンツをPDFに変換することができます。

なぜ、同期PDF生成の代わりに非同期メソッドを使う必要があるのですか?

IronPDFの非同期メソッドはデスクトップアプリケーションのUIのフリーズを防ぎ、Webアプリケーションのリクエストスループットを向上させ、マルチコアプロセッサのリソース利用を改善し、サーバー環境のスケーラビリティを向上させます。複雑なHTMLからPDFへの変換や、複数のPDFリクエストを同時に処理する場合に特に有益です。

ライブラリはPDF操作にどのような非同期パターンを使用しますか?

IronPDFはRenderHtmlAsPdfAsyncのようなメソッドを含む非同期操作のためにTask-based Asynchronous Pattern (TAP)を実装しています。このパターンはノンブロッキングのPDF生成操作を可能にし、C#のasync/awaitキーワードとシームレスに統合します。

パフォーマンスを向上させるために、複数のPDFを並列処理するにはどうすればよいですか?

IronPDFは複数のPDF世代の並列実行のためのTask.WhenAll、PDF処理のマルチスレッド化のためのParallel.ForEach、そして大規模バッチのためのチャンネルを持つproducer-consumerパターンのようなパターンを使ったバッチ処理をサポートします。これらのアプローチは、リソースの使用を最適化し、総処理時間を大幅に短縮します。

チペゴ
ソフトウェアエンジニア
Chipegoは、顧客の問題を理解し、知的な解決策を提供するのに役立つ、自然な聞くスキルを持っています。彼は2023年に情報技術の理学士を取得後、Iron Softwareチームに加わりました。IronPDFとIronOCRはChipegoが注力している2つの製品ですが、彼の全製品に対する知識は日々成長しています。彼は顧客をサポートする新しい方法を見つける中で、それを増やしています。Iron Softwareのコラボレーションの生活は、彼にとって非常に魅力的で、各部門のチームメンバーが多様な経験を持ち寄り、効果的で革新的なソリューションを提供しています。Chipegoは、デスクを離れると、良い本を読んだり、サッカーを楽しんだりすることがよくあります。
準備はできましたか?
Nuget ダウンロード 17,920,939 | バージョン: 2026.3 リリース
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronPdf
サンプルを実行するHTML が PDF に変換されるのを確認します。