Comment générer des PDF avec Async et Multithreading

Chipego
Chipego Kalinda
janvier 25, 2023
Mise à jour décembre 10, 2024
Partager:
This article was translated from English: Does it need improvement?
Translated
View the article in English

L'asynchronisme et le threading sont utiles lors de la génération de PDF haute performance en C# et VB.NET avec IronPDF par lots ou pour des performances optimisées.

Commencez avec IronPDF

Commencez à utiliser IronPDF dans votre projet dès aujourd'hui avec un essai gratuit.

Première étape :
green arrow pointer



Exemple asynchrone

IronPDF prend entièrement en charge l'utilisation asynchrone grâce à ses méthodes de rendu asynchrone telles que la méthode RenderHtmlAsPdfAsync.

: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);
$vbLabelText   $csharpLabel

Exemple de multithreading

IronPDF est sûr pour les threads et prend en charge le multithreading lorsqu'il utilise le moteur de rendu IronPdf.ChromePdfRenderer.

Le multithreading est limité sur les machines macOS.

Nous avons trouvé le modèle Parallel.ForEach très utile pour le traitement par lots de PDFs.

: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)
$vbLabelText   $csharpLabel

Comparaison des performances

Effectuons une comparaison. J'ai en outre ajouté un délai de 5 secondes dans le rendu avec la classe WaitFor pour simuler le rendu HTML complexe. Vous trouverez ci-dessous le tableau comparatif des performances obtenues à l'aide des différentes techniques décrites ci-dessus.

Normal RenderAsynchronous RenderMultithreaded Render
15.75 seconds05.59 seconds05.68 seconds
Chipego
Ingénieur logiciel
Chipego a une capacité d'écoute naturelle qui l'aide à comprendre les problèmes des clients et à proposer des solutions intelligentes. Il a rejoint l'équipe d'Iron Software en 2023, après avoir obtenu une licence en technologie de l'information. IronPDF et IronOCR sont les deux produits sur lesquels Chipego s'est concentré, mais sa connaissance de tous les produits s'accroît chaque jour, au fur et à mesure qu'il trouve de nouvelles façons d'aider les clients. Il apprécie l'esprit de collaboration qui règne chez Iron Software, les membres de l'équipe venant de toute l'entreprise et apportant leur expérience variée pour contribuer à l'élaboration de solutions efficaces et innovantes. Lorsque Chipego n'est pas à son bureau, on le trouve souvent en train de lire un bon livre ou de jouer au football.