如何实现iText 7的async-await模式?

时间:2018-03-14 11:41:44

标签: .net asynchronous async-await itext itext7

为什么iText更清晰的库不会暴露任何异步方法?

我习惯使用库中的APM方法MethodNameAsync()。它让我感到困惑,因为iText没有公开APM方法。 这有什么理由吗?阅读和操作PDF不需要异步编程吗?

我将在ASP.Net Core控制器上使用PDF读取。如果要获得性能和并行性,那么异步读取PDF不是很重要吗?

1 个答案:

答案 0 :(得分:2)

回答第一个问题:

  

为什么iText更清晰的库不会暴露任何异步方法?

通常,为自然异步的操作公开异步方法是一种很好的做法,例如不受CPU限制的网络或文件操作。有关原因的详尽解释,请参阅Stephen Cleary的优秀post,但足以说内存中PDF文档的操作很可能受CPU约束,并且不太可能提供包装在异步方法中的任何好处,但事实上如果所有这些方法都像Task.Run(...)那样会付出代价。

如果您需要通过执行CPU绑定工作(例如在UI应用程序中)来避免阻止应用程序的主线程,则可以使用Task.Run()来完成此操作,如下所示:< / p>

await Task.Run(() =>
{
    // Run numerous CPU-bound PDF operations using iTextSharp...
    var text = PdfTextExtractor.GetTextFromPage(page);
    // Run more CPU-bound PDF operations...
});

重要的一点是:这种方法允许您(API使用者)决定如何处理这样的事实,即对iText SDK进行如此多的调用主要涉及在CPU上运行。

  

阅读和操作PDF不需要异步编程吗?

或许,读取取决于它从哪里读取它。我认为他们正试图为您提供一个统一的界面,用于从多个地方读取PDF,其中一些不受I / O限制。

  

我将在ASP.Net Core控制器上使用PDF读取。如果要获得性能和并行性,那么异步读取PDF不是很重要吗?

在Stephen的帖子中也有概述,早先链接过,在ASP.NET上使用线程池线程是一个坏主意。不仅会将另一个线程池线程分配给一个请求无助于您的性能,它还将减少可用于其他请求的那些(从而限制服务器处理更多请求的能力),以及众多其他问题

关于并行主题,这是Web服务器擅长的。他们可以同时处理许多请求!因此,如果您的请求读取或生成PDF,则每个ASP.NET控制器操作都可以同步执行,其他请求仍将由Web服务器处理。如果您的PDF操作确实需要很长时间才能运行,则您可能会遇到问题。如果是这样,您应该考虑使用Hangfire或类似方式在带外运行它们,并在操作完成后通过电子邮件发送给用户。