Snæ*_*ørn 5 c# parallel-processing async-await asp.net-core ironpdf
我正在尝试使用 IronPDFs HTML 到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
根据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
小智 5
只是想补充一点,IronPdf 对 MVC Web 应用程序的多线程支持是不存在的。如果您在 HTTP 请求的上下文中进行渲染,您最终会遇到无限期的死锁。我们一直对更新渲染器能够解决该问题的承诺感到不安(我们被告知应该在 2021 年 6 月/7 月发布),但这一承诺似乎已被推迟。我使用他们的“早期访问包”测试了更新后的渲染器,死锁已被 10 秒线程块和看似随机的 C++ 异常所取代,因此它还远未得到修复。单线程性能更好。
达伦的回复是不正确的 - 我已经无数次地尝试解决这个问题,但死锁是在调用时出现的HtmlToPdf.StaticRenderHtmlAsPdf
,而不是在PdfDocument.Merge
调用时出现的。这是一个线程问题。
如果您还没有购买 IronPdf 的产品,我建议您避免使用他们的产品。寻找另一个解决方案。
感谢 Darren 在另一个线程中的帮助,我今天在 2021.9.3737 分支上使用了 IronPDF,在 Windows 和 Linux 上没有任何线程问题。
我同意 abagonhishead 的观点,即 StaticRenderHtmlAsPdf 用于创建要渲染的 PDF 文档队列,在配置不足的服务器上,它以线程死锁结束......随着服务器努力渲染 PDF,队列变得越来越长。
对我有用的解决方案: