.NET ヘルプ

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

公開済み 2025年1月14日
共有:

イントロダクション

C#のParallel.ForEachとは何ですか?

Parallel.ForEachは、コレクションまたはデータソースに対して並列イテレーションを実行できるC#のメソッドです。 コレクション内の各項目を順次処理する代わりに、並列ループは同時実行を可能にし、全体の実行時間を減らすことでパフォーマンスを大幅に向上させることができます。並列処理は、作業を複数のコアプロセッサに分配し、タスクを同時に実行することで機能します。 これは、互いに独立したタスクを処理する際に特に有用です。

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

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

IronPDFは、.NETでPDFを扱うための強力なライブラリです。HTMLをPDFに変換, PDFからのテキスト抽出, ドキュメントの結合と分割など。 大量のPDFタスクを処理する際には、Parallel.ForEachを使用して並列処理を行うことで実行時間を大幅に短縮できます。数百のPDFを生成する場合でも、複数のファイルから一度にデータを抽出する場合でも、IronPDFを活用してデータ並列性を利用することで、タスクをより迅速かつ効率的に完了することが可能です。

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

はじめに

IronPDFのインストール

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

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

IronPDFをインストールするには、次の手順に従ってください。

  1. Visual Studioでプロジェクトを開きます。

  2. ツールNuGet パッケージ マネージャーソリューションの NuGet パッケージの管理 に進みます。

    1. NuGetパッケージマネージャーでIronPDFを検索します。

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

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

    C# パラレルForeach(開発者向けの仕組み):図2

    または、NuGet パッケージ マネージャー コンソールを介してインストールすることもできます。

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

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)
VB   C#

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

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

段階的な実装

プロジェクトの設定

まず、はじめにガイドの「Getting Started」セクションに記載されているようにIronPDFがインストールされていることを確認してください。 その後、並列PDF処理ロジックの作成を開始できます。

並列処理ロジックの作成

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

string[] htmlPages = { "page1.html", "page2.html", "page3.html" };
Parallel.ForEach(htmlFiles, htmlFile =>
{
    // Load the HTML content into IronPDF and convert it to PDF
    ChromePdfRenderer renederer = new ChromePdfRenderer();
    PdfDocument pdf = renederer.RenderHtmlAsPdf(htmlFile);
    // Save the generated PDF to the output folder
    pdf.SaveAs($"output_{htmlFile}.pdf");
 });
string[] htmlPages = { "page1.html", "page2.html", "page3.html" };
Parallel.ForEach(htmlFiles, htmlFile =>
{
    // Load the HTML content into IronPDF and convert it to PDF
    ChromePdfRenderer renederer = new ChromePdfRenderer();
    PdfDocument pdf = renederer.RenderHtmlAsPdf(htmlFile);
    // Save the generated PDF to the output folder
    pdf.SaveAs($"output_{htmlFile}.pdf");
 });
Dim htmlPages() 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 renederer As New ChromePdfRenderer()
	Dim pdf As PdfDocument = renederer.RenderHtmlAsPdf(htmlFile)
	' Save the generated PDF to the output folder
	pdf.SaveAs($"output_{htmlFile}.pdf")
End Sub)
VB   C#

このコードは、複数の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)
VB   C#

実用的なユースケースと完全なコード例

複数の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
VB   C#

出力ドキュメント

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

このコードでは、各PDFファイルが並行して処理され、テキストが抽出され、抽出されたテキストは個別のテキストファイルに保存されます。

例: HTMLファイルからの並列バッチPDF生成

この例では、複数のHTMLファイルのリストから並行して複数のPDFを生成します。これは、複数の動的HTMLページをPDF文書に変換する必要がある一般的なシナリオです。

コード

using IronPdf;
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 renederer = new ChromePdfRenderer();
        PdfDocument pdf = renederer.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;
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 renederer = new ChromePdfRenderer();
        PdfDocument pdf = renederer.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
Private 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 renederer As New ChromePdfRenderer()
		Dim pdf As PdfDocument = renederer.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)
VB   C#

コンソール出力

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

PDF出力

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

説明

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

    1. パラレル処理:
  • Parallel.ForEach(htmlFiles, htmlFile => {...}) は各HTMLファイルを同時に処理するため、複数のファイルを扱う際の操作が高速化されます。

    • htmlFiles 配列内の各ファイルに対して、コードは renederer.RenderHtmlFileAsPdf を使用して PDF に変換します。(htmlFile);**
  1. PDFの保存: PDFを生成した後、pdf.SaveAsメソッドを使用して保存され、出力ファイル名に元のHTMLファイル名が追加されます。

  2. エラー処理: エラーが発生した場合(たとえば、HTMLファイルが存在しないか、変換中に問題が発生しています。)try-catchブロックでキャッチされ、特定のファイルに対してエラーメッセージが出力されます。

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

IronPDF のスレッドセーフティ問題を回避する

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

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

パフォーマンスを最適化するために、並列度を制御することを検討してください。 大規模データセットの場合、システムの過負荷を防ぐために同時実行スレッド数を制限することを検討してください。

var options = new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism = 4
};
var options = new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism = 4
};
Dim options = New ExecutionDataflowBlockOptions With {.MaxDegreeOfParallelism = 4}
VB   C#

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

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

拡張メソッドを使用する

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

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

拡張メソッドを使用することで、並列ループのロジックを簡素化し、簡潔で再利用可能なコードを作成できます。 このアプローチは重複を減らすだけでなく、特に複雑なPDFワークフローやデータの並列処理を扱う際に、クリーンなコードベースを維持するのにも役立ちます。

結論

以下を使用した並列ループParallel.ForEachIronPDF大容量のPDFを処理する際に、著しいパフォーマンス向上を提供します。 HTMLをPDFに変換する場合、テキストを抽出する場合、またはドキュメントを操作する場合、データ並列性により、タスクを同時に実行することでより速い実行が可能になります。 並列アプローチは、操作が複数のコアプロセッサーにわたって実行できることを保証し、それによって全体の実行時間を短縮し、バッチ処理タスクのパフォーマンスを向上させます。

並列処理はタスクの速度を上げますが、スレッドの安全性とリソース管理に注意してください。 IronPDFはほとんどの操作でスレッドセーフですが、共有リソースにアクセスする際の潜在的な競合に対処することが重要です。 アプリケーションがスケールする際に、特に安定性を確保するためにエラーハンドリングとメモリ管理を検討してください。

IronPDFの詳細と高度な機能を探索する準備ができたら、公式ドキュメント購入を決定する前に、自分のプロジェクトでライブラリをテストすることができます。

< 以前
C# 匿名オブジェクト(開発者向けの仕組み)
次へ >
C# Enumerable (開発者向けの仕組み)