Updated December 10, 2024
Share:

How to Generate PDFs with Async and Multithreading

Async and threading are useful when generating high-performance PDFs in C# and VB.NET with IronPDF in batches or for optimized performance.

Get started with IronPDF

Start using IronPDF in your project today with a free trial.

First Step:
green arrow pointer



Async Example

IronPDF fully supports Async using its Async Rendering methods such as the RenderHtmlAsPdfAsync method.

: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);

Multi-Threading Example

IronPDF is thread-safe and supports multithreading when using the IronPdf.ChromePdfRenderer rendering engine.

One limitation is that multithreading is limited on macOS machines.

We have found the Parallel.ForEach pattern very helpful for batch processing 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);
    }
});

Performance Comparison

Let's perform a comparison. I have additionally added a 5-second delay in rendering with the WaitFor class for simulating complex HTML rendering. Below is the comparison table of the performance using various techniques described above.

Normal RenderAsynchronous RenderMultithreaded Render
15.75 seconds05.59 seconds05.68 seconds
Chaknith Bin

Chaknith Bin

Software Engineer

 LinkedIn

Chaknith works on IronXL and IronBarcode. He has deep expertise in C# and .NET, helping improve the software and support customers. His insights from user interactions contribute to better products, documentation, and overall experience.