【问题标题】:IronPDF deadlocks when running in parallel并行运行时 IronPDF 死锁
【发布时间】:2021-03-22 00:45:24
【问题描述】:

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

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

这是一个包含基本部分的 sn-p。

调用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

【问题讨论】:

  • 您找到解决方案了吗?我遇到了同样的问题! :-(
  • 很遗憾没有。我一直在与 IronPdf 联系,他们试图在 IronPdf.Threading 中修复它,但这会破坏其他东西。他们正在进行渲染引擎改造,应该修复/改进线程,我被告知应该在 2021 年 3 月发布。我尝试了 v2021.3.1,但仍然无法正常工作。所以还在等。
  • 我不明白 IronPdf.Threading 包。命名空间不包括任何类或扩展......也没有文档。但是我想我将不得不等待更新。一次转换 1000 个 pdf 非常慢。
  • 感谢您花时间报告修复工作并将其记录在 Snæbjørn。非常有帮助。

标签: c# asp.net-core async-await parallel-processing ironpdf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    对我有用的解决方案:

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

    【讨论】:

    • 我设法使 IronPdf.EAP v2021.5.1.1 陷入僵局。我还没有尝试过最新的 v2021.6.3,希望它已修复。关于配置不足的服务器的良好说明。我正在这样的服务器上运行我的测试。
    • 完全是Snæbjørn。将网页呈现为 PDF 需要桌面杠杆的力量。我不得不查看我的服务器秒数。如果我不会整天在服务器上运行 chrome ......为什么我希望 Html 到 PDF 能够工作(facepalm ironpdf.com/docs/questions/azure
    • 我更新到 IronPdf 2021.9.3737,它似乎已经解决了死锁问题
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      此处支持 Iron Software。

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

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

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

      【讨论】:

      • 服务器配置:如果我试图在超负荷的台式电脑上打开 150 个 chrome 选项卡,我预计它会崩溃或死机。如果我在功能更弱的服务器上自动打开 150 个浏览器“标签”......我是否期望即时、稳定的结果??
      • @darren 我将示例项目更新为 IronPdf 2021.9.3737,我可以确认它现在可以工作了 :)
      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多