跳過到頁腳內容
.NET幫助

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

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套件
  3. 在NuGet套件管理器中搜尋IronPDF。

C# 平行Foreach(開發人員如何運作):圖1

  1. 點擊安裝以將IronPDF程式庫添加到您的專案中。

C# 平行Foreach(開發人員如何運作):圖2

或者,您可以透過NuGet套件管理器控制台安裝它:

Install-Package IronPdf

一旦安裝了IronPDF,您就可以開始使用它來執行PDF生成和操作任務。

Basic Concepts of Parallel.ForEach in C#

Parallel.ForEachSystem.Threading.Tasks 命名空間的一部分,提供了一種簡單而有效的方法來並行執行迭代。 Parallel.ForEach 的語法如下:

Parallel.ForEach(collection, item =>
{
    // Code to process each item
});
Parallel.ForEach(collection, item =>
{
    // Code to process each item
});
$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");
});
$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}");
    }
});
$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);
        });
    }
}
$vbLabelText   $csharpLabel

輸出文件

C# 平行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}");
            }
        });
    }
}
$vbLabelText   $csharpLabel

控制台輸出

C# 平行Foreach(開發人員如何運作):圖4

PDF輸出

C# 平行Foreach(開發人員如何運作):圖5

說明

  1. HTML文件:陣列htmlFiles包含您要轉換為PDF的多個HTML文件的路徑。

  2. 平行處理:

    • Parallel.ForEach(htmlFiles, htmlFile => {...})同時處理每個HTML文件,這在處理多個文件時加快了操作速度。
    • 對於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
};
$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# 中使用 Parallel.ForEach 進行 PDF 處理有什麼好處?

使用 Parallel.ForEach 與 IronPDF 可以進行 PDF 任務的並行執行,大大提高效能,特別是在處理大量文件時。此方法利用多核來更高效地處理 HTML 到 PDF 轉換和文字擷取等任務。

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

要在您的 .NET 專案中安裝 IronPDF,開啟 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 任務的並行度,以限制並行線程的數量。這有助於有效管理系統資源並防止過載。

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

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

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

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me