Cómo generar PDFs con Async y Multithreading
Async y threading son útiles cuando se genearting PDF en C# y VB.NET en lotes o de alto rendimiento.
Cómo generar PDFs con Async y Multithreading
Instalar con NuGet
Install-Package IronPdf
Ejemplo asíncrono
IronPDF soporta completamente Async usando sus métodos de renderizado Async como el método RenderHtmlAsPdfAsync
.
:path=/static-assets/pdf/content-code-examples/how-to/async-async.cs
using IronPdf;
using System.Threading.Tasks;
// Instanciar ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
string[] htmlStrings = {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"};
// Crear un array para almacenar las tareas de renderizado
var renderingTasks = new Task<PdfDocument>[htmlStrings.Length];
for (int i = 0; i < htmlStrings.Length; i++)
{
int index = i; // Captura de la variable de bucle
renderingTasks[i] = Task.Run(async () =>
{
// Convertir HTML en PDF
return await renderer.RenderHtmlAsPdfAsync(htmlStrings[index]);
});
}
// Esperar a que finalicen todas las tareas de renderizado
// await Task.WhenAll(renderingTasks);
Imports IronPdf
Imports System.Threading.Tasks
' Instanciar ChromePdfRenderer
Private renderer As New ChromePdfRenderer()
Private htmlStrings() As String = {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"}
' Crear un array para almacenar las tareas de renderizado
Private renderingTasks = New Task(Of PdfDocument)(htmlStrings.Length - 1){}
For i As Integer = 0 To htmlStrings.Length - 1
Dim index As Integer = i ' Captura de la variable de bucle
renderingTasks(i) = Task.Run(Async Function()
' Convertir HTML en PDF
Return Await renderer.RenderHtmlAsPdfAsync(htmlStrings(index))
End Function)
Next i
' Esperar a que finalicen todas las tareas de renderizado
' await Task.WhenAll(renderingTasks);
Ejemplo de multihilo
IronPDF es thread-safe y soporta multithreading cuando se utiliza el motor de renderizado IronPdf.ChromePdfRenderer.
Una limitación es que el multithreading está limitado en máquinas macOS.
El patrón Parallel.ForEach
nos ha resultado muy útil para procesar PDFs por lotes.
: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>" };
// Instanciar ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Crear una lista para almacenar los PDF renderizados
List<PdfDocument> pdfResults = new List<PdfDocument>();
Parallel.ForEach(queue, html =>
{
// Convertir HTML en PDF
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// Si lo desea, puede guardar aquí el PDF en el disco duro
// Para este ejemplo, lo almacenaremos en la lista pdfResults
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>"}
' Instanciar ChromePdfRenderer
Private renderer As New ChromePdfRenderer()
' Crear una lista para almacenar los PDF renderizados
Private pdfResults As New List(Of PdfDocument)()
Parallel.ForEach(queue, Sub(html)
' Convertir HTML en PDF
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
' Si lo desea, puede guardar aquí el PDF en el disco duro
' Para este ejemplo, lo almacenaremos en la lista pdfResults
SyncLock pdfResults
pdfResults.Add(pdf)
End SyncLock
End Sub)
Comparación de resultados
Hagamos una comparación. He añadido además un retardo de 5 segundos en la renderización con el botón Espere en para simular la representación de HTML más complejo. A continuación se muestra una tabla comparativa de los resultados obtenidos con las distintas técnicas descritas.
Renderizado normal | Renderización asíncrona | Renderizado multihilo |
---|---|---|
15,75 segundos | 05.59 segundo | 05,68 segundos |