5

我正在尝试使用 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

4

4 回答 4

5

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

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

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

于 2021-06-28T14:57:36.360 回答
3

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

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

对我有用的解决方案:

  • 移动到配置良好的服务器(例如 Azure B1)
  • (和/或)迁移到 IronPDF 最新的 Nuget 2021.9.3737
于 2021-07-19T07:43:04.913 回答
2

此处支持 Iron Software。

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

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

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

于 2021-06-22T02:56:13.677 回答
1

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

在此处输入图像描述

于 2021-10-21T07:45:17.587 回答