IronPDF 并行运行时出现死锁

Snæ*_*ørn 5 c# parallel-processing async-await asp.net-core ironpdf

我正在尝试使用 IronPDFs HTML 到 PDF 功能并行生成多个 PDF。但从 ASP.NET 启动时似乎陷入僵局:(

我在这里重新创建了问题:https ://github.com/snebjorn/ironpdf-threading-issue-aspnet

这是包含基本部分的片段。

打电话GetSequential()有效。但不是并行执行。 GetSimple()并行运行但出现死锁。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据https://medium.com/rubrikkgroup/understanding-async-avoiding-deadlocks-e41f8f2c6f5d,这是因为执行控制器方法的线程不是主线程。所以它只是被添加到线程池中,在某个时刻我们正在等待控制器线程继续,但它没有被调度回来。当我们async/await.Wait/.Result.

那么我假设.Wait/.Result内部发生呼叫是否正确?IronPDF.Threading是否正确?

有解决方法吗?


更新:

我更新到 IronPdf 2021.9.3737,它现在​​似乎可以工作

还更新了https://github.com/snebjorn/ironpdf-threading-issue-aspnet

小智 5

只是想补充一点,IronPdf 对 MVC Web 应用程序的多线程支持是不存在的。如果您在 HTTP 请求的上下文中进行渲染,您最终会遇到无限期的死锁。我们一直对更新渲染器能够解决该问题的承诺感到不安(我们被告知应该在 2021 年 6 月/7 月发布),但这一承诺似乎已被推迟。我使用他们的“早期访问包”测试了更新后的渲染器,死锁已被 10 秒线程块和看似随机的 C++ 异常所取代,因此它还远未得到修复。单线程性能更好。

达伦的回复是不正确的 - 我已经无数次地尝试解决这个问题,但死锁是在调用时出现的HtmlToPdf.StaticRenderHtmlAsPdf,而不是在PdfDocument.Merge调用时出现的。这是一个线程问题。

如果您还没有购买 IronPdf 的产品,我建议您避免使用他们的产品。寻找另一个解决方案。


Ste*_*nie 3

感谢 Darren 在另一个线程中的帮助,我今天在 2021.9.3737 分支上使用了 IronPDF,在 Windows 和 Linux 上没有任何线程问题。

我同意 abagonhishead 的观点,即 StaticRenderHtmlAsPdf 用于创建要渲染的 PDF 文档队列,在配置不足的服务器上,它以线程死锁结束......随着服务器努力渲染 PDF,队列变得越来越长。

对我有用的解决方案:

  • 迁移到配置良好的服务器(例如 Azure B1)
  • (和/或)迁移到 IronPDF 最新的 Nuget 2021.9.3737

  • 我更新到 IronPdf 2021.9.3737,它似乎已经解决了死锁问题 (4认同)