跳至页脚内容
.NET 帮助

C# 并行 Foreach(开发者用法)

C# 中的 Parallel.ForEach 是什么?

Parallel.ForEach 是 C# 中的一个方法,允许您对集合或数据源进行并行迭代。 通过并行循环替代对集合中每个项目的顺序处理,可以显著提高性能,缩短整体执行时间。并行处理通过将工作分配到多个核心处理器来实现,使任务能够同时运行。 这对于处理相互独立的任务特别有用。

与顺序处理项目的常见 foreach 循环相比,并行方法可以通过利用多个线程并行处理大型数据集,从而更快地处理。

为什么要在 IronPDF 中使用并行处理?

IronPDF 是用于在 .NET 中处理 PDF 的强大库,可以 将 HTML 转换为 PDF从 PDF 中提取文本合并和拆分文档,等等。 当处理大量 PDF 任务时,使用 Parallel.ForEach 并行处理可以显著缩短执行时间。无论是生成数百个 PDF 还是同时从多个文件中提取数据,利用 IronPDF 的数据并行性可以确保任务更快更有效地完成。

本指南旨在帮助 .NET 开发人员优化其使用 IronPDF 和 Parallel.ForEach 进行 PDF 处理的任务。 推荐具备 C# 的基础知识和对 IronPDF 库的熟悉。 在本指南结束时,您将能够实现并行处理以同时处理多个 PDF 任务,提高性能和可伸缩性。

开始

安装 IronPDF

要在项目中使用 IronPDF,您需要通过 NuGet 安装该库。

NuGet软件包安装

安装 IronPDF 的步骤如下:

1.在 Visual Studio 中打开您的项目。

  1. 转到 工具NuGet 包管理器为解决方案管理 NuGet 包
  2. 在NuGet包管理器中搜索IronPDF。

C#并行Foreach(开发人员如何使用):图1

  1. 点击 安装 将 IronPDF 库添加到您的项目中。

C#并行Foreach(开发人员如何使用):图2

或者,您可以通过 NuGet 包管理器控制台安装它:

Install-Package IronPdf

一旦安装了 IronPDF,您就可以开始使用它来进行 PDF 生成和操作任务。

Basic Concepts of Parallel.ForEach in C

System.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 工作流程和数据并行时,帮助您维护一个干净的代码库。

结论

使用IronPDF的并行循环如Parallel.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,然后导航到 Tools → NuGet Package Manager → Manage NuGet Packages for Solution。搜索 IronPDF 并点击 Install。或者,使用 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 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

Jacob 拥有曼彻斯特大学土木工程一级荣誉工程学士学位(BEng)(1998-2001 年)。他的旗舰产品 IronPDF 和 Iron Suite for .NET 库在全球的 NuGet 安装量已超过 3000 万次,其基础代码继续为全球使用的开发人员工具提供动力。Jacob 拥有 25 年的商业经验和 41 年的编码专业知识,他一直专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我