フッターコンテンツにスキップ
.NETヘルプ

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

C#のParallel.ForEachとは?

Parallel.ForEachは、C#でコレクションやデータソースに対して並列反復を実行するためのメソッドです。 コレクションの各アイテムを順次処理するのではなく、並列ループにより同時実行が可能となり、全体的な実行時間を短縮することでパフォーマンスが大幅に向上します。並列処理は、複数のコアプロセッサに作業を分散させ、タスクを同時に実行できるようにします。 これは、互いに独立したタスクを処理する際に特に有用です。

通常のforeachループがアイテムを順次処理するのに対し、並列アプローチは複数のスレッドを並行利用することで、大規模なデータセットをより高速に処理できます。

IronPDFで並列処理を使用する理由

IronPDF is a powerful library for handling PDFs in .NET, capable of converting HTML to PDF, extracting text from PDFs, ドキュメントを結合・分割するなどが可能です。 大量のPDFタスクを処理する際に、Parallel.ForEachを用いた並列処理を使用すると、実行時間を大幅に短縮できます。数百のPDFを生成する場合でも、複数のファイルから同時にデータを抽出する場合でも、IronPDFでデータ並列性を活用することで、より迅速かつ効率的にタスクを完了できます。

本ガイドは、IronPDFとParallel.ForEachを使用してPDF処理タスクを最適化したいと考えている.NET開発者向けです。 C#の基本的な知識とIronPDFライブラリに精通していることが推奨されます。 このガイドの終わりまでには、並列処理を実装して複数のPDFタスクを同時に処理し、パフォーマンスとスケーラビリティを向上させることができるようになります。

開始方法

Installing IronPDF

プロジェクトでIronPDFを使用するには、NuGetを介してライブラリをインストールする必要があります。

NuGetパッケージのインストール

IronPDFをインストールするには、次の手順に従います。

  1. Visual Studioでプロジェクトを開きます。
  2. ツールNuGetパッケージマネージャーソリューション用NuGetパッケージの管理に移動します。
  3. NuGetパッケージマネージャーでIronPDFを検索します。

C# Parallel Foreach (開発者向けの動作方法): 図1

  1. インストールをクリックして、IronPDFライブラリをプロジェクトに追加します。

C# Parallel Foreach (開発者向けの動作方法): 図2

または、NuGetパッケージマネージャーコンソール経由でインストールすることもできます:

Install-Package IronPdf

IronPDFがインストールされると、PDFの生成や操作のタスクに使用する準備が整います。

C#におけるParallel.ForEachの基本概念

Parallel.ForEachは、System.Threading.Tasks名前空間の一部で、反復を同時に実行するための簡単で効果的な方法を提供します。 Parallel.ForEachの構文は次のとおりです:

Parallel.ForEach(collection, item =>
{
    // Code to process each item
});
Parallel.ForEach(collection, item =>
{
    // Code to process each item
});
Parallel.ForEach(collection, Sub(item)
	' Code to process each item
End Sub)
$vbLabelText   $csharpLabel

コレクション内の各アイテムは並行して処理され、システムが利用可能なスレッドに負荷を分散する方法を決定します。 使用するスレッド数の最大数など、並列度を制御するオプションを指定することもできます。

比較すると、従来のforeachループは各アイテムを一つずつ処理しますが、並列ループは複数のアイテムを同時に処理でき、大量のコレクションを扱う際のパフォーマンスが向上します。

ステップごとの実装

プロジェクトのセットアップ

まず、IronPDFが開始セクションに記載されているようにインストールされていることを確認します。 その後、並列PDF処理のロジックを記述し始めることができます。

並列処理ロジックの記述

コードスニペット: HTMLからPDFへの変換にParallel.ForEachを使用

string[] htmlFiles = { "page1.html", "page2.html", "page3.html" };
Parallel.ForEach(htmlFiles, htmlFile =>
{
    // Load the HTML content into IronPDF and convert it to PDF
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlFile);
    // Save the generated PDF to the output folder
    pdf.SaveAs($"output_{htmlFile}.pdf");
});
string[] htmlFiles = { "page1.html", "page2.html", "page3.html" };
Parallel.ForEach(htmlFiles, htmlFile =>
{
    // Load the HTML content into IronPDF and convert it to PDF
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlFile);
    // Save the generated PDF to the output folder
    pdf.SaveAs($"output_{htmlFile}.pdf");
});
Dim htmlFiles() As String = { "page1.html", "page2.html", "page3.html" }
Parallel.ForEach(htmlFiles, Sub(htmlFile)
	' Load the HTML content into IronPDF and convert it to PDF
	Dim renderer As New ChromePdfRenderer()
	Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlFile)
	' Save the generated PDF to the output folder
	pdf.SaveAs($"output_{htmlFile}.pdf")
End Sub)
$vbLabelText   $csharpLabel

このコードは、複数のHTMLページを並列にPDFに変換する方法を示しています。

並列処理エラーの処理

並列タスクを扱う場合、エラー処理が重要です。 Parallel.ForEachループ内でtry-catchブロックを使用して、例外を管理します。

コードスニペット: 並列PDFタスクにおけるエラー処理

Parallel.ForEach(pdfFiles, pdfFile =>
{
    try
    {
        var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
        string text = pdf.ExtractAllText();
        System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error processing {pdfFile}: {ex.Message}");
    }
});
Parallel.ForEach(pdfFiles, pdfFile =>
{
    try
    {
        var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
        string text = pdf.ExtractAllText();
        System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error processing {pdfFile}: {ex.Message}");
    }
});
Parallel.ForEach(pdfFiles, Sub(pdfFile)
	Try
		Dim pdf = IronPdf.PdfDocument.FromFile(pdfFile)
		Dim text As String = pdf.ExtractAllText()
		System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text)
	Catch ex As Exception
		Console.WriteLine($"Error processing {pdfFile}: {ex.Message}")
	End Try
End Sub)
$vbLabelText   $csharpLabel

フルコード例を含む実用的なユースケース

複数のPDFからの同時テキスト抽出

並列処理のもう一つのユースケースは、一連のPDFからテキストを抽出することです。 複数のPDFファイルを処理する際、テキストの同時抽出を行うことで大幅な時間を節約できます。以下の例はその方法を示しています。

例: 複数ドキュメントからの並列テキスト抽出

using IronPdf;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] pdfFiles = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };
        Parallel.ForEach(pdfFiles, pdfFile =>
        {
            var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
            string text = pdf.ExtractText();
            System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
        });
    }
}
using IronPdf;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] pdfFiles = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };
        Parallel.ForEach(pdfFiles, pdfFile =>
        {
            var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
            string text = pdf.ExtractText();
            System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
        });
    }
}
Imports IronPdf
Imports System.Linq
Imports System.Threading.Tasks

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim pdfFiles() As String = { "doc1.pdf", "doc2.pdf", "doc3.pdf" }
		Parallel.ForEach(pdfFiles, Sub(pdfFile)
			Dim pdf = IronPdf.PdfDocument.FromFile(pdfFile)
			Dim text As String = pdf.ExtractText()
			System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text)
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

出力ドキュメント

C# Parallel Foreach (開発者向けの動作方法): 図3

このコードでは、それぞれのPDFファイルが並列処理され、テキストが抽出され、別々のテキストファイルに保存されます。

HTMLファイルからのバッチPDF生成を並列で実行する例

この例では、複数のHTMLファイルのリストから並列にPDFを生成します。動的HTMLページを複数のPDFドキュメントに変換する必要がある典型的なシナリオです。

コード

using IronPdf;
using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] htmlFiles = { "example.html", "example_1.html", "example_2.html" };
        Parallel.ForEach(htmlFiles, htmlFile =>
        {
            try
            {
                // Load the HTML content into IronPDF and convert it to PDF
                ChromePdfRenderer renderer = new ChromePdfRenderer();
                PdfDocument pdf = renderer.RenderHtmlFileAsPdf(htmlFile);
                // Save the generated PDF to the output folder
                pdf.SaveAs($"output_{htmlFile}.pdf");
                Console.WriteLine($"PDF created for {htmlFile}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error processing {htmlFile}: {ex.Message}");
            }
        });
    }
}
using IronPdf;
using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] htmlFiles = { "example.html", "example_1.html", "example_2.html" };
        Parallel.ForEach(htmlFiles, htmlFile =>
        {
            try
            {
                // Load the HTML content into IronPDF and convert it to PDF
                ChromePdfRenderer renderer = new ChromePdfRenderer();
                PdfDocument pdf = renderer.RenderHtmlFileAsPdf(htmlFile);
                // Save the generated PDF to the output folder
                pdf.SaveAs($"output_{htmlFile}.pdf");
                Console.WriteLine($"PDF created for {htmlFile}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error processing {htmlFile}: {ex.Message}");
            }
        });
    }
}
Imports IronPdf
Imports System
Imports System.Threading.Tasks

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim htmlFiles() As String = { "example.html", "example_1.html", "example_2.html" }
		Parallel.ForEach(htmlFiles, Sub(htmlFile)
			Try
				' Load the HTML content into IronPDF and convert it to PDF
				Dim renderer As New ChromePdfRenderer()
				Dim pdf As PdfDocument = renderer.RenderHtmlFileAsPdf(htmlFile)
				' Save the generated PDF to the output folder
				pdf.SaveAs($"output_{htmlFile}.pdf")
				Console.WriteLine($"PDF created for {htmlFile}")
			Catch ex As Exception
				Console.WriteLine($"Error processing {htmlFile}: {ex.Message}")
			End Try
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

コンソール出力

C# Parallel Foreach (開発者向けの動作方法): 図4

PDF出力

C# Parallel Foreach (開発者向けの動作方法): 図5

説明

  1. HTMLファイル: 配列htmlFilesには、PDFに変換したい複数のHTMLファイルのパスが含まれています。

  2. 並列処理:

    • Parallel.ForEach(htmlFiles, htmlFile => {...})が各HTMLファイルを同時に処理し、複数のファイルを扱う際の操作を速度アップさせます。
    • htmlFiles配列の各ファイルに対して、renderer.RenderHtmlFileAsPdf(htmlFile);を使用してPDFに変換します。
  3. PDFの保存: PDFの生成が完了したら、pdf.SaveAsメソッドを使用して保存し、オリジナルのHTMLファイル名を出力ファイル名に追加します。

  4. エラー処理: エラーが発生した場合(例:HTMLファイルが存在しない、変換中に問題が発生したなど)、try-catchブロックによって捕捉され、特定のファイルに対してエラーメッセージが出力されます。

パフォーマンスのヒントとベストプラクティス

IronPDFでのスレッドセーフティ問題の回避

IronPDFはほとんどの操作においてスレッドセーフです。 ただし、並列で同じファイルに書き込むような操作には問題が発生する可能性があります。 常に各並列タスクが別の出力ファイルやリソースを操作するようにしてください。

大規模データセットのための並列処理最適化

パフォーマンスを最適化するには、並列度の制御を考慮する必要があります。 大規模なデータセットに対しては、システムへの負荷を防ぐため、同時実行スレッド数を制限することを検討してください。

var options = new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism = 4
};
var options = new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism = 4
};
Dim options = New ExecutionDataflowBlockOptions With {.MaxDegreeOfParallelism = 4}
$vbLabelText   $csharpLabel

並列PDF操作におけるメモリ管理

大量のPDFを処理する際は、メモリ使用量に注意が必要です。 PdfDocumentオブジェクトなどのリソースは、不要になったらすぐに解放するように心がけてください。

拡張メソッドの使用

拡張メソッドは、既存の型に新しい機能を追加し、そのソースコードを変更せずに拡張する特別な静的メソッドです。 これは、IronPDFのようなライブラリを利用する際に、カスタム処理メソッドを追加したり、並列処理シナリオでPDFの取り扱いを便利にするための機能を拡張するのに役立ちます。

並列処理における拡張メソッド使用の利点

拡張メソッドを使用することで、並列ループのロジックを簡潔かつ再利用可能なコードにまとめることができます。 このアプローチは、複雑なPDFワークフローやデータ並列性を処理する際に、コードの重複を減らし、クリーンなコードベースを維持するのに役立ちます。

結論

Parallel.ForEachのような並列ループをIronPDFと組み合わせることで、大量のPDFを扱う際に大幅なパフォーマンス向上が得られます。 HTMLをPDFに変換したり、テキストを抽出したり、ドキュメントを操作したりする際に、データ並列性によりタスクの同時実行を可能にし、より迅速な実行を実現します。 並列アプローチにより、作業を複数のコアプロセッサで実行できるようになり、全体の実行時間を短縮し、バッチ処理タスクのパフォーマンスを向上させます。

並列処理によってタスクの速度が向上する一方で、スレッドセーフティやリソース管理にも気を配る必要があります。 IronPDFはほとんどの操作においてスレッドセーフですが、共有リソースへのアクセス時に潜在的な競合を扱うことが重要です。 エラー処理やメモリ管理を考慮し、アプリケーションのスケーラビリティを確保してください。

IronPDFの奥深くに入り、より高度な機能を探る準備ができているなら、公式ドキュメントに豊富な情報があります。 さらに、自分のプロジェクトでライブラリを試す前に購入を決定する際に、トライアルライセンスを活用することができます。

よくある質問

C#で複数のHTMLファイルを同時にPDFに変換するにはどうすればよいですか?

IronPDFをParallel.ForEachメソッドと組み合わせることで、複数のHTMLファイルを同時にPDFに変換できます。このアプローチは、並列処理を活用して、総実行時間を短縮し、パフォーマンスを向上させます。

C#でのPDF処理においてParallel.ForEachを使用する利点は何ですか?

IronPDFとParallel.ForEachを使用することで、PDFタスクを同時に実行でき、大量のファイルを扱う場合に特にパフォーマンスを大幅に向上させます。この方法は、HTMLからPDFへの変換やテキスト抽出などのタスクをより効率的に処理するために複数のコアを利用します。

.NETで並列処理タスク用のPDFライブラリをインストールするにはどうすればよいですか?

Visual Studioを開き、ツール→NuGetパッケージマネージャ→ソリューションのためのNuGetパッケージの管理に移動して、IronPDFを検索し、インストールしてください。または、NuGetパッケージマネージャコンソールでInstall-Package IronPdfコマンドを使用してください。

並列PDF処理におけるエラーハンドリングのベストプラクティスは何ですか?

IronPDFを使用した並列PDF処理では、例外を処理するためにParallel.ForEachループ内でtry-catchブロックを使用してください。これにより、個別のタスクの失敗が全体のプロセスに影響を与えるのを防ぎながら、堅牢なエラーハンドリングを確保できます。

IronPDFは同時に複数のPDFからテキストを抽出することができますか?

はい、IronPDFはParallel.ForEachメソッドを利用することで、同時に複数のPDFからテキストを抽出することができ、大規模なデータセットを効率的に処理できます。

IronPDFは同時並行のPDF操作に対してスレッドセーフですか?

IronPDFはほとんどの操作においてスレッドセーフになるように設計されています。しかし、各並列タスクが異なるファイルなどの別々のリソースで動作することを確認し、競合を避けてデータの整合性を確保することが重要です。

C#での並列PDF操作中にメモリ管理を改善するにはどうすればいいですか?

メモリ管理を最適化するために、多数のPDFを処理する場合、PdfDocumentオブジェクトなどのリソースを使用後速やかに解放してください。これにより、最適なメモリ使用率とシステムパフォーマンスを維持できます。

C#での並列PDF処理における拡張メソッドの役割は何ですか?

拡張メソッドは既存の型に、そのソースコードを変更せずに機能を追加できます。IronPDFを使用した並列PDF処理では、再利用可能で簡潔なコードを作成し、並列ループ内での操作を簡素化するのに役立ちます。

C#でのPDFタスクにおける並列度を制御するにはどうすればよいですか?

C#では、ExecutionDataflowBlockOptionsのようなオプションを使用して、PDFタスクの並列度を制限することで、同時実行するスレッドの数を制御できます。これにより、システムリソースを効果的に管理し、オーバーロードを防ぐことができます。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。