运行 并行时 IronPDF 死锁
IronPDF deadlocks when running in parallel
我正在尝试使用 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
此处支持 Iron 软件。
我们的工程师测试了您的示例项目,迭代次数增加到 150 次,运行 没有问题。
我们对您的用例的期望是您正在创建多个线程来生成 PDF 文件并将这些文件存储到一个数组中以便稍后合并?
假设是这种情况,导致此问题的可能原因是向合并方法发送的数组太大,这需要大量 RAM 才能处理。崩溃是内存没有处理大量要合并的PDFS。
只是想补充一点,IronPdf 对 MVC 网络应用程序的多线程支持是不存在的。如果您在 HTTP 请求的上下文中呈现,您将最终陷入无限期的死锁。
我们一直被承诺更新渲染器来解决这个问题(我们被告知应该在 June/July 2021 年发布),但似乎已被推迟。我使用他们的 'early-access package' 测试了更新后的渲染器,死锁已被 10 秒线程块和看似随机的 C++ 异常所取代,因此它远未得到修复。单线程性能更好。
Darren 的回复是不正确的 - 我已经无数次通过我们的渲染调用来尝试解决这个问题,但死锁出现在 HtmlToPdf.StaticRenderHtmlAsPdf
调用上,而不是 PdfDocument.Merge
调用上。这是一个线程问题。
如果您还没有购买他们的产品,我建议避免使用 IronPdf。寻找其他解决方案。
我今天在 2021.9.3737 分支 上使用了 IronPDF,没有任何线程问题 在 windows 和 Linux 上感谢 Darren 在另一个线程中的帮助。
- 文档:https://ironpdf.com/object-reference/api/
- Nuget:https://www.nuget.org/packages/IronPdf/
- 信息来源:C# PDF Generation (using IronPDF on Azure)
我同意 abagonhishead 的观点,即 StaticRenderHtmlAsPdf 用于创建要呈现的 PDF 文档队列,并且在配置不足的服务器上它以线程死锁结束......随着服务器努力进行,队列变得越来越长渲染 PDF。
对我有用的解决方案:
- 移动到配置良好的服务器(例如 Azure B1)
- (and/or) 迁移到 IronPDF 最新的 Nuget 2021.9.3737
正如您从附图中看到的那样,我用 1000 次迭代测试了您的代码并且它没有问题,我相信当您增加迭代或输入大 HTML 大小达到最大 CPU 和无法处理的内存容量。
另外,我不同意 abagonhishead,因为市场上没有提供所有这些功能的替代解决方案
我正在尝试使用 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
此处支持 Iron 软件。
我们的工程师测试了您的示例项目,迭代次数增加到 150 次,运行 没有问题。
我们对您的用例的期望是您正在创建多个线程来生成 PDF 文件并将这些文件存储到一个数组中以便稍后合并?
假设是这种情况,导致此问题的可能原因是向合并方法发送的数组太大,这需要大量 RAM 才能处理。崩溃是内存没有处理大量要合并的PDFS。
只是想补充一点,IronPdf 对 MVC 网络应用程序的多线程支持是不存在的。如果您在 HTTP 请求的上下文中呈现,您将最终陷入无限期的死锁。 我们一直被承诺更新渲染器来解决这个问题(我们被告知应该在 June/July 2021 年发布),但似乎已被推迟。我使用他们的 'early-access package' 测试了更新后的渲染器,死锁已被 10 秒线程块和看似随机的 C++ 异常所取代,因此它远未得到修复。单线程性能更好。
Darren 的回复是不正确的 - 我已经无数次通过我们的渲染调用来尝试解决这个问题,但死锁出现在 HtmlToPdf.StaticRenderHtmlAsPdf
调用上,而不是 PdfDocument.Merge
调用上。这是一个线程问题。
如果您还没有购买他们的产品,我建议避免使用 IronPdf。寻找其他解决方案。
我今天在 2021.9.3737 分支 上使用了 IronPDF,没有任何线程问题 在 windows 和 Linux 上感谢 Darren 在另一个线程中的帮助。
- 文档:https://ironpdf.com/object-reference/api/
- Nuget:https://www.nuget.org/packages/IronPdf/
- 信息来源:C# PDF Generation (using IronPDF on Azure)
我同意 abagonhishead 的观点,即 StaticRenderHtmlAsPdf 用于创建要呈现的 PDF 文档队列,并且在配置不足的服务器上它以线程死锁结束......随着服务器努力进行,队列变得越来越长渲染 PDF。
对我有用的解决方案:
- 移动到配置良好的服务器(例如 Azure B1)
- (and/or) 迁移到 IronPDF 最新的 Nuget 2021.9.3737
正如您从附图中看到的那样,我用 1000 次迭代测试了您的代码并且它没有问题,我相信当您增加迭代或输入大 HTML 大小达到最大 CPU 和无法处理的内存容量。 另外,我不同意 abagonhishead,因为市场上没有提供所有这些功能的替代解决方案