如何使用异步和多线程生成 PDF
异步和线程在生成 PDF 时非常有用 C# 和 VB.NET 中的 PDF 批量或高性能
如何使用异步和多线程生成 PDF
开始在您的项目中使用IronPDF,并立即获取免费试用。
查看 IronPDF 上 Nuget 用于快速安装和部署。它有超过800万次下载,正在使用C#改变PDF。
Install-Package IronPdf
考虑安装 IronPDF DLL 直接。下载并手动安装到您的项目或GAC表单中: IronPdf.zip
手动安装到你的项目中
下载DLL异步示例
IronPDF 使用其 Async 渲染方法(如 RenderHtmlAsPdfAsync
方法)完全支持 Async。
:path=/static-assets/pdf/content-code-examples/how-to/async-async.cs
using IronPdf;
using System.Threading.Tasks;
// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
string[] htmlStrings = {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"};
// Create an array to store the tasks for rendering
var renderingTasks = new Task<PdfDocument>[htmlStrings.Length];
for (int i = 0; i < htmlStrings.Length; i++)
{
int index = i; // Capturing the loop variable
renderingTasks[i] = Task.Run(async () =>
{
// Render HTML to PDF
return await renderer.RenderHtmlAsPdfAsync(htmlStrings[index]);
});
}
// Wait for all rendering tasks to complete
// await Task.WhenAll(renderingTasks);
Imports IronPdf
Imports System.Threading.Tasks
' Instantiate ChromePdfRenderer
Private renderer As New ChromePdfRenderer()
Private htmlStrings() As String = {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"}
' Create an array to store the tasks for rendering
Private renderingTasks = New Task(Of PdfDocument)(htmlStrings.Length - 1){}
For i As Integer = 0 To htmlStrings.Length - 1
Dim index As Integer = i ' Capturing the loop variable
renderingTasks(i) = Task.Run(Async Function()
' Render HTML to PDF
Return Await renderer.RenderHtmlAsPdfAsync(htmlStrings(index))
End Function)
Next i
' Wait for all rendering tasks to complete
' await Task.WhenAll(renderingTasks);
多线程实例
当使用 IronPdf.ChromePdfRenderer 渲染引擎时,IronPDF 是线程安全并支持多线程的。
一个限制是,多线程在 macOS 机器上受到限制。
我们发现,"Parallel.ForEach "模式对批量处理 PDF 非常有用。
:path=/static-assets/pdf/content-code-examples/how-to/async-multi-thread.cs
using IronPdf;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
var queue = new List<string>() { "<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>" };
// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Create a list to store the rendered PDFs
List<PdfDocument> pdfResults = new List<PdfDocument>();
Parallel.ForEach(queue, html =>
{
// Render HTML to PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// You may choose to save the PDF to disk here if needed
// For this example, we'll store it in the pdfResults list
lock (pdfResults)
{
pdfResults.Add(pdf);
}
});
Imports IronPdf
Imports System.Collections.Concurrent
Imports System.Collections.Generic
Imports System.Threading.Tasks
Private queue = New List(Of String)() From {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"}
' Instantiate ChromePdfRenderer
Private renderer As New ChromePdfRenderer()
' Create a list to store the rendered PDFs
Private pdfResults As New List(Of PdfDocument)()
Parallel.ForEach(queue, Sub(html)
' Render HTML to PDF
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
' You may choose to save the PDF to disk here if needed
' For this example, we'll store it in the pdfResults list
SyncLock pdfResults
pdfResults.Add(pdf)
End SyncLock
End Sub)
性能比较
我们来做个比较。我使用 等待 类来模拟呈现更复杂的 HTML。以下是使用上述各种技术的性能比较表。
正常渲染 | 异步渲染 | 多线程渲染 |
---|---|---|
15.75 秒 | 05.59 秒 | 05.68 秒 |