【发布时间】: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