gpt4 book ai didi

c# - 并行运行时 IronPDF 死锁

转载 作者:行者123 更新时间:2023-12-04 11:51:45 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com