Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IronPDF deadlocks when running in parallel

I'm trying to generate multiple PDFs in parallel using IronPDFs HTML to PDF feature. But it appears to be deadlocking when started from ASP.NET :(

I've recreated the problem here: https://github.com/snebjorn/ironpdf-threading-issue-aspnet

Here's a snippet with the essential parts.

Calling GetSequential() works. But is not executing in parallel. GetSimple() is running in parallel but deadlocks.

public class TestController : Controller
{
    [HttpGet]
    [Route("simple")]
    public async Task<IActionResult> GetSimple()
    {
        var tasks = Enumerable
            .Range(1, 10)
            .Select(i => HtmlToDocumentAsync("hello", i));
        var pdfs = await Task.WhenAll(tasks);

        using var pdf = PdfDocument.Merge(pdfs);
        pdf.SaveAs("output.pdf");
        return Ok();
    }

    [HttpGet]
    [Route("seq")]
    public async Task<IActionResult> GetSequential()
    {
        var pdfs = new List<PdfDocument>();
        foreach (var i in Enumerable.Range(1, 10))
        {
            pdfs.Add(await HtmlToDocumentAsync("hello", i));
        }

        using var pdf = PdfDocument.Merge(pdfs);
        pdf.SaveAs("output.pdf");
        return Ok();
    }

    private async Task<PdfDocument> HtmlToDocumentAsync(string html, int i)
    {
        using var renderer = new HtmlToPdf();
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        return pdf;
    }
}

According to https://medium.com/rubrikkgroup/understanding-async-avoiding-deadlocks-e41f8f2c6f5d it's because the thread executing the controller method isn't a main thread. So it just gets added to the thread pool and at some point we're waiting for the controller thread to continue but it's not getting scheduled back in. This happens when we mix async/await with .Wait/.Result.

So am I right to assume that there are .Wait/.Result calls happening inside the IronPDF.Threading package?

Is there a workaround?


UPDATE:

I updated to IronPdf 2021.9.3737 and it now appears to work 🎉

Also updated https://github.com/snebjorn/ironpdf-threading-issue-aspnet

like image 726
Snæbjørn Avatar asked Dec 31 '22 18:12

Snæbjørn


1 Answers

Just wanted to add to this that IronPdf's multi-threading support on MVC web apps is non-existent. You will end up with indefinite deadlocks if you're rendering in the context of an HTTP request. We have been strung along with the promise of an updated renderer that would resolve the issue (which we were told should be released June/July 2021) but that appears to have been pushed back. I tested the updated renderer using their 'early-access package' and the deadlocking has been replaced by 10 second thread blocks and seemingly random C++ exceptions, so it's far from being fixed. Performance is better single-threaded.

Darren's reply is incorrect - I've stepped through our render calls countless times trying to fix this, and the deadlock comes on the HtmlToPdf.StaticRenderHtmlAsPdf call, not on a PdfDocument.Merge call. It's a threading issue.

I suggest avoiding IronPdf if you haven't already bought their product. Find another solution.

like image 101
abagonhishead Avatar answered Jan 12 '23 22:01

abagonhishead