c# - 并行运行时 IronPDF 死锁

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

我正在尝试使用 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这是因为执行 Controller 方法的线程不是主线程。所以它只是被添加到线程池中,并且在某些时候我们正在等待 Controller 线程继续,但它没有被重新安排。当我们混合时会发生这种情况 async/await.Wait/.Result .
所以我假设有 .Wait/.Result 是否正确? IronPDF.Threading 内部发生的调用包裹?
有解决方法吗?

更新:
我更新到 IronPdf 2021.9.3737,现在似乎可以工作了 🎉
也更新了 https://github.com/snebjorn/ironpdf-threading-issue-aspnet

最佳答案

只是想补充一点,IronPdf 对 MVC Web 应用程序的多线程支持是不存在的。如果您在 HTTP 请求的上下文中呈现,您将最终陷入无限期的死锁。
我们一直 promise 更新渲染器将解决该问题(我们被告知应该在 2021 年 6 月/7 月发布),但似乎已被推迟。我使用他们的“早期访问包”测试了更新的渲染器,死锁已被 10 秒线程块和看似随机的 C++ 异常所取代,因此远未得到修复。单线程的性能更好。
Darren 的回复是不正确的 - 我已经无数次尝试通过我们的渲染调用来解决这个问题,并且死锁出现在 HtmlToPdf.StaticRenderHtmlAsPdf 上。打电话,不是在 PdfDocument.Merge称呼。这是线程问题。
如果您还没有购买他们的产品,我建议避免使用 IronPdf。寻找另一个解决方案。

关于c# - 并行运行时 IronPDF 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65237160/

相关文章:

c# - == 或 .Equals()

c# - 如何使用 UIImage.FromImage(context.ToImage()) 防止内存泄漏?

c# - 从 ASP.NET Core 1.1 MVC 迁移到 2.0 后自定义 cookie 身份验证不起作用

c# - Azure DevOps如何通过引用另一个解决方案中的另一个项目来构建项目

c# - 在异步函数中,为什么我必须等待?

c# - 使用 WebService 自动捕获所有未处理的异常

c# - 旋转 IEnumerable 列表

c# - ASP.Net Core Sql session 持久化

c# - 如何异步运行 3 个进程,当一个返回期望值时停止其他两个并继续执行程序?

reactjs - 如何 Jest 模拟 AWS 库