跳過到頁腳內容
.NET幫助

C#並行Foreach(開發者工作方式)

什麼是 C# 中的 Parallel.ForEach?

Parallel.ForEach 是 C# 中的一種方法,可讓您在集合或資料來源上執行平行迭代。 並行迴圈並不是依序處理集合中的每個項目,而是實現並發執行,這可以減少整體執行時間,從而顯著提高性能。平行處理的工作方式是將工作分派給多個核心處理器,讓任務可以同時執行。 這在處理彼此獨立的任務時尤其有用。

一般的 foreach 循環會依序處理項目,相較之下,並行方式則可利用多個線程並行處理大型資料集,速度更快。

為何使用 IronPDF 進行平行處理?

IronPDF 是一個功能強大的函式庫,用於在 .NET 中處理 PDF,能夠 將 HTML 轉換為 PDF從 PDF 中萃取文字merging and splitting documents 等。 在處理大量 PDF 任務時,使用 Parallel.ForEach 進行平行處理可大幅縮短執行時間。無論您是要一次產生數百個 PDF,或是從多個檔案中抽取資料,利用 IronPDF 的資料並行性都能確保任務更快速、更有效率地完成。

本指南面向希望使用 IronPDF for .NET 和 Parallel.ForEach 優化 PDF 處理任務的 .NET 開發人員。 建議具備 C# 的基本知識,並熟悉 IronPDF 函式庫。 在本指南結束時,您將能夠實現並行處理,以同時處理多個 PDF 任務,從而提高性能和可擴展性。

開始

安裝 IronPDF。

若要在專案中使用 IronPDF,您需要透過 NuGet 安裝函式庫。

NuGet 套件安裝

要安裝 IronPdf,請遵循以下步驟:

1.在 Visual Studio 中開啟您的專案。 2.前往 工具NuGet套件管理員管理解決方案的NuGet套件。 3.在 NuGet 套件管理器中搜尋 IronPDF。

C# Parallel Foreach (How it Works for Developers):圖 1

4.按一下 安裝,將 IronPDF 函式庫新增至您的專案。

C# Parallel Foreach (How it Works for Developers):圖 2

另外,您也可以透過 NuGet 套件管理員控制台進行安裝:

Install-Package IronPdf

安裝 IronPDF 之後,您就可以開始使用 IronPDF 執行 PDF 產生與處理任務了。

C# 中 Parallel.ForEach 的基本概念;

Parallel.ForEachSystem.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 處理邏輯了。

撰寫平行處理邏輯

程式碼片段:使用 Parallel.ForEach 進行 HTML 到 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");
});
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 (How it Works for Developers):圖 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 (How it Works for Developers):圖 4

PDF輸出

C# Parallel Foreach (How it Works for Developers):圖 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 工作流程和資料平行性時。

結論

使用 IronPDFParallel.ForEach 之類的並行循環,可在處理大量 PDF 時大幅提升效能。 無論您是將 HTML 轉換為 PDF、擷取文字或處理文件,資料並行都能透過同時執行任務來加快執行速度。 並行方式可確保操作可在多個核心處理器上執行,這可縮短整體執行時間,並提高批次處理任務的效能。

雖然平行處理可加快任務速度,但也要注意線程安全和資源管理。 IronPDF 對於大多數的操作都是線程安全的,但在存取共用資源時,處理潛在的衝突是很重要的。 考慮錯誤處理和記憶體管理,以確保穩定性,特別是當您的應用程式擴充時。

如果您準備深入了解 IronPDF 並探索進階功能,官方文件可提供廣泛的資訊。 此外,您可以利用他們的試用授權,讓您在承諾購買之前,先在自己的專案中測試該函式庫。

常見問題解答

如何使用 C# 將多個 HTML 檔案同時轉換為 PDF?

您可以使用 IronPDF 搭配 Parallel.ForEach 方法,同時將多份 HTML 檔案轉換為 PDF。此方法利用並發處理來減少總執行時間,從而提升效能。

在 C# 中使用 Parallel.ForEach 與 PDF 處理有什麼好處?

使用 IronPDF 的 Parallel.ForEach,可以並發執行 PDF 任務,大幅提升效能,尤其是在處理大量檔案時。此方法可利用多核心來更有效率地處理 HTML 至 PDF 轉換和文字萃取等工作。

如何為平行處理任務安裝 .NET PDF 函式庫?

若要為您的 .NET 專案安裝 IronPDF,請開啟 Visual Studio 並導航至工具 → NuGet 套件管理員 → 管理解決方案的 NuGet 套件。搜尋 IronPdf,然後按一下安裝。或者,使用 NuGet Package Manager Console 並執行下列指令:Install-Package IronPdf

並行 PDF 處理中錯誤處理的最佳實務是什麼?

在使用 IronPDF 進行 PDF 並行處理時,請在 Parallel.ForEach 環路中使用 try-catch 區塊來處理異常。這可確保穩健的錯誤管理,並防止個別任務故障影響整體流程。

IronPDF 可以同時處理多個 PDF 的文字萃取嗎?

是的,IronPDF 可以利用 Parallel.ForEach 方法同時從多個 PDF 中提取文字,實現了高效處理大型資料集的並發處理。

IronPDF 對於 PDF 並發作業是線程安全的嗎?

IronPDF 的設計對於大多數的操作都是線程安全的。然而,重要的是要確保每個平行任務在不同的資源上運作,例如不同的檔案,以避免衝突並確保資料的完整性。

如何改善 C# 中 PDF 平行作業時的記憶體管理?

為了優化記憶體管理,請在使用 PdfDocument 物件後立即釋放資源,尤其是在處理大量 PDF 時。這有助於保持最佳的記憶體使用率和系統性能。

擴充方法在 C# 的平行 PDF 處理中扮演什麼角色?

擴充方法可讓您在不修改原始碼的情況下,為現有類型增加功能。它們在使用 IronPDF 進行 PDF 並行處理時非常有用,可建立可重複使用的簡潔程式碼,簡化並行循環內的操作。

如何在 C# 中控制 PDF 任務的平行度?

在 C# 中,您可以透過使用 ExecutionDataflowBlockOptions 等選項來控制 PDF 任務的平行程度,以限制並發線程數量。這有助於有效管理系統資源,並防止超載。

Jacob Mellor, Team Iron 首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。

他的旗艦產品 IronPDF & Iron Suite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。