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.


Biblioteca NuGet C# para PDF

Instalar con NuGet

Install-Package IronPdf
o
Java PDF JAR

Descargar DLL

Descargar DLL

Instalar manualmente en su proyecto

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);
VB   C#

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)
VB   C#

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 normalRenderización asíncronaRenderizado multihilo
15,75 segundos05.59 segundo05,68 segundos