我正在尝试使用 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这是因为执行控制器方法的线程不是主线程。所以它只是被添加到线程池中,在某些时候我们正在等待控制器线程继续,但它没有被安排回来。当我们async/await
与.Wait/.Result
.
那么我是否正确地假设包.Wait/.Result
内发生了呼叫IronPDF.Threading
?
有解决方法吗?
更新:
我更新到 IronPdf 2021.9.3737 现在似乎可以工作了
还更新了 https://github.com/snebjorn/ironpdf-threading-issue-aspnet