运行 并行时 IronPDF 死锁

IronPDF deadlocks when running in parallel

我正在尝试使用 IronPDFs HTML to 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;
    }
}

根据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

此处支持 Iron 软件。

我们的工程师测试了您的示例项目,迭代次数增加到 150 次,运行 没有问题。

我们对您的用例的期望是您正在创建多个线程来生成 PDF 文件并将这些文件存储到一个数组中以便稍后合并?

假设是这种情况,导致此问题的可能原因是向合并方法发送的数组太大,这需要大量 RAM 才能处理。崩溃是内存没有处理大量要合并的PDFS。

只是想补充一点,IronPdf 对 MVC 网络应用程序的多线程支持是不存在的。如果您在 HTTP 请求的上下文中呈现,您将最终陷入无限期的死锁。 我们一直被承诺更新渲染器来解决这个问题(我们被告知应该在 June/July 2021 年发布),但似乎已被推迟。我使用他们的 'early-access package' 测试了更新后的渲染器,死锁已被 10 秒线程块和看似随机的 C++ 异常所取代,因此它远未得到修复。单线程性能更好。

Darren 的回复是不正确的 - 我已经无数次通过我们的渲染调用来尝试解决这个问题,但死锁出现在 HtmlToPdf.StaticRenderHtmlAsPdf 调用上,而不是 PdfDocument.Merge 调用上。这是一个线程问题。

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

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

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

对我有用的解决方案:

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

正如您从附图中看到的那样,我用 1000 次迭代测试了您的代码并且它没有问题,我相信当您增加迭代或输入大 HTML 大小达到最大 CPU 和无法处理的内存容量。 另外,我不同意 abagonhishead,因为市场上没有提供所有这些功能的替代解决方案